@welshman/net 0.1.1 → 0.2.0
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/LICENSE +21 -0
- package/dist/lib/src/Deferred.d.ts +21 -0
- package/dist/lib/src/Deferred.d.ts.map +1 -0
- package/dist/lib/src/Deferred.js +21 -0
- package/dist/lib/src/Deferred.js.map +1 -0
- package/dist/lib/src/Emitter.d.ts +14 -0
- package/dist/lib/src/Emitter.d.ts.map +1 -0
- package/dist/lib/src/Emitter.js +18 -0
- package/dist/lib/src/Emitter.js.map +1 -0
- package/dist/lib/src/LRUCache.d.ts +42 -0
- package/dist/lib/src/LRUCache.d.ts.map +1 -0
- package/dist/lib/src/LRUCache.js +62 -0
- package/dist/lib/src/LRUCache.js.map +1 -0
- package/dist/lib/src/TaskQueue.d.ts +20 -0
- package/dist/lib/src/TaskQueue.d.ts.map +1 -0
- package/dist/lib/src/TaskQueue.js +57 -0
- package/dist/lib/src/TaskQueue.js.map +1 -0
- package/dist/lib/src/Tools.d.ts +727 -0
- package/dist/lib/src/Tools.d.ts.map +1 -0
- package/dist/lib/src/Tools.js +1224 -0
- package/dist/lib/src/Tools.js.map +1 -0
- package/dist/lib/src/index.d.ts +7 -0
- package/dist/lib/src/index.d.ts.map +1 -0
- package/dist/lib/src/index.js +7 -0
- package/dist/lib/src/index.js.map +1 -0
- package/dist/lib/src/normalize-url/index.d.ts +286 -0
- package/dist/lib/src/normalize-url/index.d.ts.map +1 -0
- package/dist/lib/src/normalize-url/index.js +252 -0
- package/dist/lib/src/normalize-url/index.js.map +1 -0
- package/{build → dist/net}/src/adapter.d.ts +5 -7
- package/dist/net/src/adapter.d.ts.map +1 -0
- package/dist/net/src/adapter.js.map +1 -0
- package/{build → dist/net}/src/auth.d.ts +7 -21
- package/dist/net/src/auth.d.ts.map +1 -0
- package/{build → dist/net}/src/auth.js +35 -58
- package/dist/net/src/auth.js.map +1 -0
- package/{build → dist/net}/src/context.d.ts +3 -0
- package/dist/net/src/context.d.ts.map +1 -0
- package/{build → dist/net}/src/context.js +3 -3
- package/dist/net/src/context.js.map +1 -0
- package/{build → dist/net}/src/diff.d.ts +3 -4
- package/dist/net/src/diff.d.ts.map +1 -0
- package/{build → dist/net}/src/diff.js +11 -13
- package/dist/net/src/diff.js.map +1 -0
- package/{build → dist/net}/src/index.d.ts +1 -0
- package/dist/net/src/index.d.ts.map +1 -0
- package/dist/net/src/index.js.map +1 -0
- package/{build → dist/net}/src/message.d.ts +1 -0
- package/dist/net/src/message.d.ts.map +1 -0
- package/dist/net/src/message.js.map +1 -0
- package/{build → dist/net}/src/negentropy.d.ts +2 -1
- package/dist/net/src/negentropy.d.ts.map +1 -0
- package/{build → dist/net}/src/negentropy.js +42 -18
- package/dist/net/src/negentropy.js.map +1 -0
- package/{build → dist/net}/src/policy.d.ts +16 -8
- package/dist/net/src/policy.d.ts.map +1 -0
- package/{build → dist/net}/src/policy.js +61 -83
- package/dist/net/src/policy.js.map +1 -0
- package/{build → dist/net}/src/pool.d.ts +2 -1
- package/dist/net/src/pool.d.ts.map +1 -0
- package/{build → dist/net}/src/pool.js +8 -8
- package/dist/net/src/pool.js.map +1 -0
- package/dist/net/src/publish.d.ts +44 -0
- package/dist/net/src/publish.d.ts.map +1 -0
- package/dist/net/src/publish.js +96 -0
- package/dist/net/src/publish.js.map +1 -0
- package/dist/net/src/request.d.ts +55 -0
- package/dist/net/src/request.d.ts.map +1 -0
- package/dist/net/src/request.js +212 -0
- package/dist/net/src/request.js.map +1 -0
- package/{build → dist/net}/src/socket.d.ts +11 -9
- package/dist/net/src/socket.d.ts.map +1 -0
- package/{build → dist/net}/src/socket.js +15 -8
- package/dist/net/src/socket.js.map +1 -0
- package/{build → dist/net}/src/tracker.d.ts +1 -0
- package/dist/net/src/tracker.d.ts.map +1 -0
- package/dist/net/src/tracker.js.map +1 -0
- package/dist/net/src/util.d.ts +2 -0
- package/dist/net/src/util.d.ts.map +1 -0
- package/{build → dist/net}/src/util.js.map +1 -1
- package/dist/relay/src/index.d.ts +3 -0
- package/dist/relay/src/index.d.ts.map +1 -0
- package/dist/relay/src/index.js +3 -0
- package/dist/relay/src/index.js.map +1 -0
- package/dist/relay/src/relay.d.ts +13 -0
- package/dist/relay/src/relay.d.ts.map +1 -0
- package/dist/relay/src/relay.js +48 -0
- package/dist/relay/src/relay.js.map +1 -0
- package/dist/relay/src/repository.d.ts +63 -0
- package/dist/relay/src/repository.d.ts.map +1 -0
- package/dist/relay/src/repository.js +270 -0
- package/dist/relay/src/repository.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/util/src/Address.d.ts +21 -0
- package/dist/util/src/Address.d.ts.map +1 -0
- package/dist/util/src/Address.js +43 -0
- package/dist/util/src/Address.js.map +1 -0
- package/dist/util/src/Encryptable.d.ts +34 -0
- package/dist/util/src/Encryptable.d.ts.map +1 -0
- package/dist/util/src/Encryptable.js +52 -0
- package/dist/util/src/Encryptable.js.map +1 -0
- package/dist/util/src/Events.d.ts +77 -0
- package/dist/util/src/Events.d.ts.map +1 -0
- package/dist/util/src/Events.js +63 -0
- package/dist/util/src/Events.js.map +1 -0
- package/dist/util/src/Filters.d.ts +48 -0
- package/dist/util/src/Filters.d.ts.map +1 -0
- package/dist/util/src/Filters.js +185 -0
- package/dist/util/src/Filters.js.map +1 -0
- package/dist/util/src/Handler.d.ts +17 -0
- package/dist/util/src/Handler.d.ts.map +1 -0
- package/dist/util/src/Handler.js +33 -0
- package/dist/util/src/Handler.js.map +1 -0
- package/dist/util/src/Kinds.d.ts +159 -0
- package/dist/util/src/Kinds.d.ts.map +1 -0
- package/dist/util/src/Kinds.js +160 -0
- package/dist/util/src/Kinds.js.map +1 -0
- package/dist/util/src/Links.d.ts +3 -0
- package/dist/util/src/Links.d.ts.map +1 -0
- package/dist/util/src/Links.js +3 -0
- package/dist/util/src/Links.js.map +1 -0
- package/dist/util/src/List.d.ts +34 -0
- package/dist/util/src/List.d.ts.map +1 -0
- package/dist/util/src/List.js +74 -0
- package/dist/util/src/List.js.map +1 -0
- package/dist/util/src/Profile.d.ts +26 -0
- package/dist/util/src/Profile.d.ts.map +1 -0
- package/dist/util/src/Profile.js +50 -0
- package/dist/util/src/Profile.js.map +1 -0
- package/dist/util/src/Relay.d.ts +32 -0
- package/dist/util/src/Relay.d.ts.map +1 -0
- package/dist/util/src/Relay.js +49 -0
- package/dist/util/src/Relay.js.map +1 -0
- package/dist/util/src/Tags.d.ts +32 -0
- package/dist/util/src/Tags.d.ts.map +1 -0
- package/dist/util/src/Tags.js +74 -0
- package/dist/util/src/Tags.js.map +1 -0
- package/dist/util/src/Zaps.d.ts +20 -0
- package/dist/util/src/Zaps.d.ts.map +1 -0
- package/dist/util/src/Zaps.js +93 -0
- package/dist/util/src/Zaps.js.map +1 -0
- package/dist/util/src/index.d.ts +13 -0
- package/dist/util/src/index.d.ts.map +1 -0
- package/dist/util/src/index.js +13 -0
- package/dist/util/src/index.js.map +1 -0
- package/package.json +18 -21
- package/README.md +0 -61
- package/build/src/adapter.js.map +0 -1
- package/build/src/auth.js.map +0 -1
- package/build/src/context.js.map +0 -1
- package/build/src/diff.js.map +0 -1
- package/build/src/index.js.map +0 -1
- package/build/src/message.js.map +0 -1
- package/build/src/negentropy.js.map +0 -1
- package/build/src/policy.js.map +0 -1
- package/build/src/pool.js.map +0 -1
- package/build/src/publish.d.ts +0 -60
- package/build/src/publish.js +0 -120
- package/build/src/publish.js.map +0 -1
- package/build/src/request.d.ts +0 -79
- package/build/src/request.js +0 -191
- package/build/src/request.js.map +0 -1
- package/build/src/socket.js.map +0 -1
- package/build/src/tracker.js.map +0 -1
- package/build/src/util.d.ts +0 -3
- package/build/tsconfig.tsbuildinfo +0 -1
- /package/{build → dist/net}/src/adapter.js +0 -0
- /package/{build → dist/net}/src/index.js +0 -0
- /package/{build → dist/net}/src/message.js +0 -0
- /package/{build → dist/net}/src/tracker.js +0 -0
- /package/{build → dist/net}/src/util.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Links.d.ts","sourceRoot":"","sources":["../../../../util/src/Links.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,WAAmC,CAAA;AAEzE,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,WAAgD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Links.js","sourceRoot":"","sources":["../../../../util/src/Links.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RelayMode } from "./Relay.js";
|
|
2
|
+
import { Encryptable, DecryptedEvent } from "./Encryptable.js";
|
|
3
|
+
export type ListParams = {
|
|
4
|
+
kind: number;
|
|
5
|
+
};
|
|
6
|
+
export type List = ListParams & {
|
|
7
|
+
publicTags: string[][];
|
|
8
|
+
privateTags: string[][];
|
|
9
|
+
event?: DecryptedEvent;
|
|
10
|
+
};
|
|
11
|
+
export type PublishedList = Omit<List, "event"> & {
|
|
12
|
+
event: DecryptedEvent;
|
|
13
|
+
};
|
|
14
|
+
export declare const makeList: (list: ListParams & Partial<List>) => List;
|
|
15
|
+
export declare const readList: (event: DecryptedEvent) => PublishedList;
|
|
16
|
+
export declare const getListTags: (list: List | undefined) => string[][];
|
|
17
|
+
export declare const removeFromListByPredicate: (list: List, pred: (t: string[]) => boolean) => Encryptable<{
|
|
18
|
+
kind: number;
|
|
19
|
+
content: string;
|
|
20
|
+
tags: string[][];
|
|
21
|
+
}>;
|
|
22
|
+
export declare const removeFromList: (list: List, value: string) => Encryptable<{
|
|
23
|
+
kind: number;
|
|
24
|
+
content: string;
|
|
25
|
+
tags: string[][];
|
|
26
|
+
}>;
|
|
27
|
+
export declare const addToListPublicly: (list: List, ...tags: string[][]) => Encryptable<{
|
|
28
|
+
kind: number;
|
|
29
|
+
content: string;
|
|
30
|
+
tags: string[][];
|
|
31
|
+
}>;
|
|
32
|
+
export declare const addToListPrivately: (list: List, ...tags: string[][]) => Encryptable<import("./Events.js").EventTemplate>;
|
|
33
|
+
export declare const getRelaysFromList: (list?: List, mode?: RelayMode) => string[];
|
|
34
|
+
//# sourceMappingURL=List.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../../util/src/List.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,SAAS,EAAoB,MAAM,YAAY,CAAA;AACnE,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAG5D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG;IAC9B,UAAU,EAAE,MAAM,EAAE,EAAE,CAAA;IACtB,WAAW,EAAE,MAAM,EAAE,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG;IAChD,KAAK,EAAE,cAAc,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAG,IAI1D,CAAA;AAaF,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,KAAG,aAMhD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,MAAM,IAAI,GAAG,SAAS,eAGjD,CAAA;AAED,eAAO,MAAM,yBAAyB,GAAI,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO;;;;EAcnF,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,EAAE,OAAO,MAAM;;;;EACN,CAAA;AAElD,eAAO,MAAM,iBAAiB,GAAI,MAAM,IAAI,EAAE,GAAG,MAAM,MAAM,EAAE,EAAE;;;;EAQhE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,EAAE,GAAG,MAAM,MAAM,EAAE,EAAE,qDASjE,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAO,IAAI,EAAE,OAAO,SAAS,KAAG,MAAM,EAQvE,CAAA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { parseJson, uniq, nthEq } from "@welshman/lib";
|
|
2
|
+
import { Address } from "./Address.js";
|
|
3
|
+
import { uniqTags, getRelayTags } from "./Tags.js";
|
|
4
|
+
import { isRelayUrl, normalizeRelayUrl } from "./Relay.js";
|
|
5
|
+
import { Encryptable } from "./Encryptable.js";
|
|
6
|
+
export const makeList = (list) => ({
|
|
7
|
+
publicTags: [],
|
|
8
|
+
privateTags: [],
|
|
9
|
+
...list,
|
|
10
|
+
});
|
|
11
|
+
const isValidTag = (tag) => {
|
|
12
|
+
if (tag[0] === "p")
|
|
13
|
+
return tag[1]?.length === 64;
|
|
14
|
+
if (tag[0] === "e")
|
|
15
|
+
return tag[1]?.length === 64;
|
|
16
|
+
if (tag[0] === "a")
|
|
17
|
+
return Address.isAddress(tag[1] || "");
|
|
18
|
+
if (tag[0] === "t")
|
|
19
|
+
return tag[1]?.length > 0;
|
|
20
|
+
if (tag[0] === "r")
|
|
21
|
+
return isRelayUrl(tag[1]);
|
|
22
|
+
if (tag[0] === "relay")
|
|
23
|
+
return isRelayUrl(tag[1]);
|
|
24
|
+
return true;
|
|
25
|
+
};
|
|
26
|
+
export const readList = (event) => {
|
|
27
|
+
const getTags = (tags) => (Array.isArray(tags) ? tags.filter(isValidTag) : []);
|
|
28
|
+
const privateTags = getTags(parseJson(event.plaintext?.content));
|
|
29
|
+
const publicTags = getTags(event.tags);
|
|
30
|
+
return { event, kind: event.kind, publicTags, privateTags };
|
|
31
|
+
};
|
|
32
|
+
export const getListTags = (list) => [
|
|
33
|
+
...(list?.publicTags || []),
|
|
34
|
+
...(list?.privateTags || []),
|
|
35
|
+
];
|
|
36
|
+
export const removeFromListByPredicate = (list, pred) => {
|
|
37
|
+
const plaintext = {};
|
|
38
|
+
const template = {
|
|
39
|
+
kind: list.kind,
|
|
40
|
+
content: list.event?.content || "",
|
|
41
|
+
tags: list.publicTags.filter(t => !pred(t)),
|
|
42
|
+
};
|
|
43
|
+
// Avoid redundant encrypt calls if possible
|
|
44
|
+
if (list.privateTags.some(t => pred(t))) {
|
|
45
|
+
plaintext.content = JSON.stringify(list.privateTags.filter(t => !pred(t)));
|
|
46
|
+
}
|
|
47
|
+
return new Encryptable(template, plaintext);
|
|
48
|
+
};
|
|
49
|
+
export const removeFromList = (list, value) => removeFromListByPredicate(list, nthEq(1, value));
|
|
50
|
+
export const addToListPublicly = (list, ...tags) => {
|
|
51
|
+
const template = {
|
|
52
|
+
kind: list.kind,
|
|
53
|
+
content: list.event?.content || "",
|
|
54
|
+
tags: uniqTags([...list.publicTags, ...tags]),
|
|
55
|
+
};
|
|
56
|
+
return new Encryptable(template, {});
|
|
57
|
+
};
|
|
58
|
+
export const addToListPrivately = (list, ...tags) => {
|
|
59
|
+
const template = {
|
|
60
|
+
kind: list.kind,
|
|
61
|
+
tags: list.publicTags,
|
|
62
|
+
};
|
|
63
|
+
return new Encryptable(template, {
|
|
64
|
+
content: JSON.stringify(uniqTags([...list.privateTags, ...tags])),
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
export const getRelaysFromList = (list, mode) => {
|
|
68
|
+
let tags = getRelayTags(getListTags(list));
|
|
69
|
+
if (mode) {
|
|
70
|
+
tags = tags.filter((t) => !t[2] || t[2] === mode);
|
|
71
|
+
}
|
|
72
|
+
return uniq(tags.map(t => normalizeRelayUrl(t[1])));
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=List.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../util/src/List.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TrustedEvent, EventTemplate } from "./Events.js";
|
|
2
|
+
export type Profile = {
|
|
3
|
+
name?: string;
|
|
4
|
+
nip05?: string;
|
|
5
|
+
lud06?: string;
|
|
6
|
+
lud16?: string;
|
|
7
|
+
lnurl?: string;
|
|
8
|
+
about?: string;
|
|
9
|
+
banner?: string;
|
|
10
|
+
picture?: string;
|
|
11
|
+
website?: string;
|
|
12
|
+
display_name?: string;
|
|
13
|
+
event?: TrustedEvent;
|
|
14
|
+
};
|
|
15
|
+
export type PublishedProfile = Omit<Profile, "event"> & {
|
|
16
|
+
event: TrustedEvent;
|
|
17
|
+
};
|
|
18
|
+
export declare const isPublishedProfile: (profile: Profile) => profile is PublishedProfile;
|
|
19
|
+
export declare const makeProfile: (profile?: Partial<Profile>) => Profile;
|
|
20
|
+
export declare const readProfile: (event: TrustedEvent) => PublishedProfile;
|
|
21
|
+
export declare const createProfile: ({ event, ...profile }: Profile) => EventTemplate;
|
|
22
|
+
export declare const editProfile: ({ event, ...profile }: PublishedProfile) => EventTemplate;
|
|
23
|
+
export declare const displayPubkey: (pubkey: string) => string;
|
|
24
|
+
export declare const displayProfile: (profile?: Profile, fallback?: string) => string;
|
|
25
|
+
export declare const profileHasName: (profile?: Profile) => boolean;
|
|
26
|
+
//# sourceMappingURL=Profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profile.d.ts","sourceRoot":"","sources":["../../../../util/src/Profile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,aAAa,CAAA;AAIvD,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG;IACtD,KAAK,EAAE,YAAY,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,gBACzC,CAAA;AAExB,eAAO,MAAM,WAAW,GAAI,UAAS,OAAO,CAAC,OAAO,CAAM,KAAG,OAkB5D,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,YAAY,KAAG,gBAGhD,CAAA;AAEF,eAAO,MAAM,aAAa,GAAI,uBAAqB,OAAO,KAAG,aAI3D,CAAA;AAEF,eAAO,MAAM,WAAW,GAAI,uBAAqB,gBAAgB,KAAG,aAIlE,CAAA;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,WAI3C,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,EAAE,iBAAa,WAQ9D,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,YAAoD,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { npubEncode } from "nostr-tools/nip19";
|
|
2
|
+
import { ellipsize, parseJson } from "@welshman/lib";
|
|
3
|
+
import { getLnUrl } from "./Zaps.js";
|
|
4
|
+
import { PROFILE } from "./Kinds.js";
|
|
5
|
+
export const isPublishedProfile = (profile) => Boolean(profile.event);
|
|
6
|
+
export const makeProfile = (profile = {}) => {
|
|
7
|
+
if (typeof profile.lud06 === "string") {
|
|
8
|
+
const lnurl = getLnUrl(profile.lud06);
|
|
9
|
+
if (lnurl) {
|
|
10
|
+
profile = { ...profile, lnurl };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (typeof profile.lud16 === "string") {
|
|
14
|
+
const lnurl = getLnUrl(profile.lud16);
|
|
15
|
+
if (lnurl) {
|
|
16
|
+
profile = { ...profile, lnurl };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return profile;
|
|
20
|
+
};
|
|
21
|
+
export const readProfile = (event) => ({
|
|
22
|
+
...makeProfile(parseJson(event.content) || {}),
|
|
23
|
+
event,
|
|
24
|
+
});
|
|
25
|
+
export const createProfile = ({ event, ...profile }) => ({
|
|
26
|
+
kind: PROFILE,
|
|
27
|
+
content: JSON.stringify(profile),
|
|
28
|
+
tags: [],
|
|
29
|
+
});
|
|
30
|
+
export const editProfile = ({ event, ...profile }) => ({
|
|
31
|
+
kind: PROFILE,
|
|
32
|
+
content: JSON.stringify(profile),
|
|
33
|
+
tags: event.tags,
|
|
34
|
+
});
|
|
35
|
+
export const displayPubkey = (pubkey) => {
|
|
36
|
+
const d = npubEncode(pubkey);
|
|
37
|
+
return d.slice(0, 8) + "…" + d.slice(-5);
|
|
38
|
+
};
|
|
39
|
+
export const displayProfile = (profile, fallback = "") => {
|
|
40
|
+
const { display_name, name, event } = profile || {};
|
|
41
|
+
if (name)
|
|
42
|
+
return ellipsize(name, 60).trim();
|
|
43
|
+
if (display_name)
|
|
44
|
+
return ellipsize(display_name, 60).trim();
|
|
45
|
+
if (event)
|
|
46
|
+
return displayPubkey(event.pubkey).trim();
|
|
47
|
+
return fallback.trim();
|
|
48
|
+
};
|
|
49
|
+
export const profileHasName = (profile) => Boolean(profile?.name || profile?.display_name);
|
|
50
|
+
//# sourceMappingURL=Profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profile.js","sourceRoot":"","sources":["../../../../util/src/Profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare enum RelayMode {
|
|
2
|
+
Read = "read",
|
|
3
|
+
Write = "write",
|
|
4
|
+
Inbox = "inbox"
|
|
5
|
+
}
|
|
6
|
+
export type RelayProfile = {
|
|
7
|
+
url: string;
|
|
8
|
+
icon?: string;
|
|
9
|
+
banner?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
pubkey?: string;
|
|
12
|
+
contact?: string;
|
|
13
|
+
software?: string;
|
|
14
|
+
version?: string;
|
|
15
|
+
negentropy?: number;
|
|
16
|
+
description?: string;
|
|
17
|
+
supported_nips?: number[];
|
|
18
|
+
limitation?: {
|
|
19
|
+
min_pow_difficulty?: number;
|
|
20
|
+
payment_required?: boolean;
|
|
21
|
+
auth_required?: boolean;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare const isRelayUrl: (url: string) => boolean;
|
|
25
|
+
export declare const isOnionUrl: (url: string) => boolean;
|
|
26
|
+
export declare const isLocalUrl: (url: string) => boolean;
|
|
27
|
+
export declare const isIPAddress: (url: string) => boolean;
|
|
28
|
+
export declare const isShareableRelayUrl: (url: string) => boolean;
|
|
29
|
+
export declare const normalizeRelayUrl: (url: string) => string;
|
|
30
|
+
export declare const displayRelayUrl: (url: string) => string;
|
|
31
|
+
export declare const displayRelayProfile: (profile?: RelayProfile, fallback?: string) => string;
|
|
32
|
+
//# sourceMappingURL=Relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Relay.d.ts","sourceRoot":"","sources":["../../../../util/src/Relay.ts"],"names":[],"mappings":"AAIA,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,UAAU,CAAC,EAAE;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,aAAa,CAAC,EAAE,OAAO,CAAA;KACxB,CAAA;CACF,CAAA;AAID,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,YAqBrC,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,YAA6D,CAAA;AAEnG,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,YACiD,CAAA;AAEvF,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,YAA6C,CAAA;AAEpF,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,YAAiD,CAAA;AAEhG,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,WAe5C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,WAA8C,CAAA;AAEzF,eAAO,MAAM,mBAAmB,GAAI,UAAU,YAAY,EAAE,iBAAa,WAC9C,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { last, normalizeUrl, stripProtocol } from "@welshman/lib";
|
|
2
|
+
// Constants and types
|
|
3
|
+
export var RelayMode;
|
|
4
|
+
(function (RelayMode) {
|
|
5
|
+
RelayMode["Read"] = "read";
|
|
6
|
+
RelayMode["Write"] = "write";
|
|
7
|
+
RelayMode["Inbox"] = "inbox";
|
|
8
|
+
})(RelayMode || (RelayMode = {}));
|
|
9
|
+
// Utils related to bare urls
|
|
10
|
+
export const isRelayUrl = (url) => {
|
|
11
|
+
if (!url.includes("://")) {
|
|
12
|
+
url = "wss://" + url;
|
|
13
|
+
}
|
|
14
|
+
// Skip non-ws urls
|
|
15
|
+
if (!url.match(/^wss?:\/\//))
|
|
16
|
+
return false;
|
|
17
|
+
// Skip urls with a slash before the dot
|
|
18
|
+
if (url.match(/\\.*\./))
|
|
19
|
+
return false;
|
|
20
|
+
// Skip non-localhost urls without a dot
|
|
21
|
+
if (!url.match(/\./) && !url.includes("localhost"))
|
|
22
|
+
return false;
|
|
23
|
+
try {
|
|
24
|
+
new URL(url);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
export const isOnionUrl = (url) => Boolean(stripProtocol(url).match(/^[a-z2-7]{56}.onion/));
|
|
32
|
+
export const isLocalUrl = (url) => Boolean(url.match(/\.local(:[\d]+)?\/?$/) || stripProtocol(url).match(/^localhost:/));
|
|
33
|
+
export const isIPAddress = (url) => Boolean(url.match(/\d+\.\d+\.\d+\.\d+/));
|
|
34
|
+
export const isShareableRelayUrl = (url) => Boolean(isRelayUrl(url) && !isLocalUrl(url));
|
|
35
|
+
export const normalizeRelayUrl = (url) => {
|
|
36
|
+
const prefix = url.match(/^wss?:\/\//)?.[0] || (isOnionUrl(url) ? "ws://" : "wss://");
|
|
37
|
+
// Use our library to normalize
|
|
38
|
+
url = normalizeUrl(url, { stripHash: true, stripAuthentication: false });
|
|
39
|
+
// Strip the protocol, lowercase
|
|
40
|
+
url = stripProtocol(url).toLowerCase();
|
|
41
|
+
// Urls without pathnames are supposed to have a trailing slash
|
|
42
|
+
if (!url.includes("/")) {
|
|
43
|
+
url += "/";
|
|
44
|
+
}
|
|
45
|
+
return prefix + url;
|
|
46
|
+
};
|
|
47
|
+
export const displayRelayUrl = (url) => last(url.split("://")).replace(/\/$/, "");
|
|
48
|
+
export const displayRelayProfile = (profile, fallback = "") => profile?.name || fallback;
|
|
49
|
+
//# sourceMappingURL=Relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Relay.js","sourceRoot":"","sources":["../../../../util/src/Relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,YAAY,EAAE,aAAa,EAAC,MAAM,eAAe,CAAA;AAE/D,sBAAsB;AAEtB,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,4BAAe,CAAA;AACjB,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAqBD,6BAA6B;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAA;IACtB,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAA;IAE1C,wCAAwC;IACxC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IAErC,wCAAwC;IACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAA;IAEhE,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAEnG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAA;AAEvF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAA;AAEpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAErF,+BAA+B;IAC/B,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAC,CAAC,CAAA;IAEtE,gCAAgC;IAChC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAEtC,+DAA+D;IAC/D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,IAAI,GAAG,CAAA;IACZ,CAAC;IAED,OAAO,MAAM,GAAG,GAAG,CAAA;AACrB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,CAC3E,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const getTags: (types: string | string[], tags: string[][]) => string[][];
|
|
2
|
+
export declare const getTag: (types: string | string[], tags: string[][]) => string[] | undefined;
|
|
3
|
+
export declare const getTagValues: (types: string | string[], tags: string[][]) => string[];
|
|
4
|
+
export declare const getTagValue: (types: string | string[], tags: string[][]) => string | undefined;
|
|
5
|
+
export declare const getEventTags: (tags: string[][]) => string[][];
|
|
6
|
+
export declare const getEventTagValues: (tags: string[][]) => string[];
|
|
7
|
+
export declare const getAddressTags: (tags: string[][]) => string[][];
|
|
8
|
+
export declare const getAddressTagValues: (tags: string[][]) => string[];
|
|
9
|
+
export declare const getPubkeyTags: (tags: string[][]) => string[][];
|
|
10
|
+
export declare const getPubkeyTagValues: (tags: string[][]) => string[];
|
|
11
|
+
export declare const getTopicTags: (tags: string[][]) => string[][];
|
|
12
|
+
export declare const getTopicTagValues: (tags: string[][]) => string[];
|
|
13
|
+
export declare const getRelayTags: (tags: string[][]) => string[][];
|
|
14
|
+
export declare const getRelayTagValues: (tags: string[][]) => string[];
|
|
15
|
+
export declare const getGroupTags: (tags: string[][]) => string[][];
|
|
16
|
+
export declare const getGroupTagValues: (tags: string[][]) => string[];
|
|
17
|
+
export declare const getKindTags: (tags: string[][]) => string[][];
|
|
18
|
+
export declare const getKindTagValues: (tags: string[][]) => number[];
|
|
19
|
+
export declare const getCommentTags: (tags: string[][]) => {
|
|
20
|
+
roots: string[][];
|
|
21
|
+
replies: string[][];
|
|
22
|
+
};
|
|
23
|
+
export declare const getCommentTagValues: (tags: string[][]) => Record<string, string[]>;
|
|
24
|
+
export declare const getReplyTags: (tags: string[][]) => {
|
|
25
|
+
roots: string[][];
|
|
26
|
+
replies: string[][];
|
|
27
|
+
mentions: string[][];
|
|
28
|
+
};
|
|
29
|
+
export declare const getReplyTagValues: (tags: string[][]) => Record<string, string[]>;
|
|
30
|
+
export declare const uniqTags: (tags: string[][]) => string[][];
|
|
31
|
+
export declare const tagsFromIMeta: (imeta: string[]) => string[][];
|
|
32
|
+
//# sourceMappingURL=Tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tags.d.ts","sourceRoot":"","sources":["../../../../util/src/Tags.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,GAAG,MAAM,EAAE,EAAE,MAAM,MAAM,EAAE,EAAE,eAIjE,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,GAAG,MAAM,EAAE,EAAE,MAAM,MAAM,EAAE,EAAE,yBAIhE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,GAAG,MAAM,EAAE,EAAE,MAAM,MAAM,EAAE,EAAE,aACrC,CAAA;AAElC,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,GAAG,MAAM,EAAE,EAAE,MAAM,MAAM,EAAE,EAAE,uBAA6B,CAAA;AAEnG,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,EAAE,eACiB,CAAA;AAE9D,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,EAAE,aAAmC,CAAA;AAErF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,EAAE,eACoB,CAAA;AAEnE,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,EAAE,aAAqC,CAAA;AAEzF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,EAAE,eACgB,CAAA;AAE9D,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,EAAE,aAAoC,CAAA;AAEvF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,EAAE,eAA+B,CAAA;AAE5E,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,EAAE,aACG,CAAA;AAErD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,EAAE,eAC8B,CAAA;AAE3E,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,EAAE,aAAmC,CAAA;AAErF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,EAAE,eACsC,CAAA;AAEnF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,EAAE,aAAmC,CAAA;AAErF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,EAAE,eACmB,CAAA;AAE/D,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,EAAE,aAA+C,CAAA;AAEhG,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,EAAE;;;CAK9C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,EAAE,6BACK,CAAA;AAEzD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,EAAE;;;;CAkC5C,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,EAAE,6BACK,CAAA;AAEvD,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,EAAE,eAA+C,CAAA;AAExF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,eAA2C,CAAA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { uniqBy, mapVals, nth, nthEq, ensurePlural } from "@welshman/lib";
|
|
2
|
+
import { isRelayUrl } from "./Relay.js";
|
|
3
|
+
import { Address } from "./Address.js";
|
|
4
|
+
export const getTags = (types, tags) => {
|
|
5
|
+
types = ensurePlural(types);
|
|
6
|
+
return tags.filter(t => types.includes(t[0]));
|
|
7
|
+
};
|
|
8
|
+
export const getTag = (types, tags) => {
|
|
9
|
+
types = ensurePlural(types);
|
|
10
|
+
return tags.find(t => types.includes(t[0]));
|
|
11
|
+
};
|
|
12
|
+
export const getTagValues = (types, tags) => getTags(types, tags).map(nth(1));
|
|
13
|
+
export const getTagValue = (types, tags) => getTag(types, tags)?.[1];
|
|
14
|
+
export const getEventTags = (tags) => tags.filter(t => ["e"].includes(t[0]) && t[1].length === 64);
|
|
15
|
+
export const getEventTagValues = (tags) => getEventTags(tags).map(nth(1));
|
|
16
|
+
export const getAddressTags = (tags) => tags.filter(t => ["a"].includes(t[0]) && Address.isAddress(t[1]));
|
|
17
|
+
export const getAddressTagValues = (tags) => getAddressTags(tags).map(nth(1));
|
|
18
|
+
export const getPubkeyTags = (tags) => tags.filter(t => ["p"].includes(t[0]) && t[1].length === 64);
|
|
19
|
+
export const getPubkeyTagValues = (tags) => getPubkeyTags(tags).map(nth(1));
|
|
20
|
+
export const getTopicTags = (tags) => tags.filter(nthEq(0, "t"));
|
|
21
|
+
export const getTopicTagValues = (tags) => getTopicTags(tags).map(t => t[1].replace(/^#/, ""));
|
|
22
|
+
export const getRelayTags = (tags) => tags.filter(t => ["r", "relay"].includes(t[0]) && isRelayUrl(t[1] || ""));
|
|
23
|
+
export const getRelayTagValues = (tags) => getRelayTags(tags).map(nth(1));
|
|
24
|
+
export const getGroupTags = (tags) => tags.filter(t => ["h", "group"].includes(t[0]) && t[1] && isRelayUrl(t[2] || ""));
|
|
25
|
+
export const getGroupTagValues = (tags) => getGroupTags(tags).map(nth(1));
|
|
26
|
+
export const getKindTags = (tags) => tags.filter(t => ["k"].includes(t[0]) && t[1].match(/^\d+$/));
|
|
27
|
+
export const getKindTagValues = (tags) => getKindTags(tags).map(t => parseInt(t[1]));
|
|
28
|
+
export const getCommentTags = (tags) => {
|
|
29
|
+
const roots = tags.filter(t => ["A", "E", "P", "K"].includes(t[0]));
|
|
30
|
+
const replies = tags.filter(t => ["a", "e", "p", "k"].includes(t[0]));
|
|
31
|
+
return { roots, replies };
|
|
32
|
+
};
|
|
33
|
+
export const getCommentTagValues = (tags) => mapVals(tags => tags.map(nth(1)), getCommentTags(tags));
|
|
34
|
+
export const getReplyTags = (tags) => {
|
|
35
|
+
const validTags = tags.filter(t => ["a", "e", "q"].includes(t[0]));
|
|
36
|
+
const mentionTags = validTags.filter(nthEq(0, "q"));
|
|
37
|
+
const roots = [];
|
|
38
|
+
const replies = [];
|
|
39
|
+
const mentions = [];
|
|
40
|
+
const dispatchTags = (thisTags) => thisTags.forEach((t, i) => {
|
|
41
|
+
if (t[3] === "root") {
|
|
42
|
+
if (validTags.filter(nthEq(3, "reply")).length === 0) {
|
|
43
|
+
replies.push(t);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
roots.push(t);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (t[3] === "reply") {
|
|
50
|
+
replies.push(t);
|
|
51
|
+
}
|
|
52
|
+
else if (t[3] === "mention") {
|
|
53
|
+
mentions.push(t);
|
|
54
|
+
}
|
|
55
|
+
else if (i === thisTags.length - 1) {
|
|
56
|
+
replies.push(t);
|
|
57
|
+
}
|
|
58
|
+
else if (i === 0) {
|
|
59
|
+
roots.push(t);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
mentions.push(t);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Add different types separately so positional logic works
|
|
66
|
+
dispatchTags(validTags.filter(nthEq(0, "e")));
|
|
67
|
+
dispatchTags(validTags.filter(nthEq(0, "a")).filter(t => Boolean(t[3])));
|
|
68
|
+
mentionTags.forEach((t) => mentions.push(t));
|
|
69
|
+
return { roots, replies, mentions };
|
|
70
|
+
};
|
|
71
|
+
export const getReplyTagValues = (tags) => mapVals(tags => tags.map(nth(1)), getReplyTags(tags));
|
|
72
|
+
export const uniqTags = (tags) => uniqBy(t => t.slice(0, 2).join(":"), tags);
|
|
73
|
+
export const tagsFromIMeta = (imeta) => imeta.map((m) => m.split(" "));
|
|
74
|
+
//# sourceMappingURL=Tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tags.js","sourceRoot":"","sources":["../../../../util/src/Tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TrustedEvent } from "./Events.js";
|
|
2
|
+
export declare const hrpToMillisat: (hrpString: string) => bigint;
|
|
3
|
+
export declare const getInvoiceAmount: (bolt11: string) => number;
|
|
4
|
+
export declare const getLnUrl: (address: string) => string | null;
|
|
5
|
+
export type Zapper = {
|
|
6
|
+
lnurl: string;
|
|
7
|
+
pubkey?: string;
|
|
8
|
+
callback?: string;
|
|
9
|
+
minSendable?: number;
|
|
10
|
+
maxSendable?: number;
|
|
11
|
+
nostrPubkey?: string;
|
|
12
|
+
allowsNostr?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type Zap = {
|
|
15
|
+
request: TrustedEvent;
|
|
16
|
+
response: TrustedEvent;
|
|
17
|
+
invoiceAmount: number;
|
|
18
|
+
};
|
|
19
|
+
export declare const zapFromEvent: (response: TrustedEvent, zapper: Zapper | undefined) => Zap | null;
|
|
20
|
+
//# sourceMappingURL=Zaps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Zaps.d.ts","sourceRoot":"","sources":["../../../../util/src/Zaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AAa7C,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,WA2B9C,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,WAI9C,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,kBAsBvC,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,YAAY,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,UAAU,YAAY,EAAE,QAAQ,MAAM,GAAG,SAAS,eA0C9E,CAAA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { hexToBech32, fromPairs } from "@welshman/lib";
|
|
2
|
+
const DIVISORS = {
|
|
3
|
+
m: BigInt(1e3),
|
|
4
|
+
u: BigInt(1e6),
|
|
5
|
+
n: BigInt(1e9),
|
|
6
|
+
p: BigInt(1e12),
|
|
7
|
+
};
|
|
8
|
+
const MAX_MILLISATS = BigInt("2100000000000000000");
|
|
9
|
+
const MILLISATS_PER_BTC = BigInt(1e11);
|
|
10
|
+
export const hrpToMillisat = (hrpString) => {
|
|
11
|
+
let divisor, value;
|
|
12
|
+
if (hrpString.slice(-1).match(/^[munp]$/)) {
|
|
13
|
+
divisor = hrpString.slice(-1);
|
|
14
|
+
value = hrpString.slice(0, -1);
|
|
15
|
+
}
|
|
16
|
+
else if (hrpString.slice(-1).match(/^[^munp0-9]$/)) {
|
|
17
|
+
throw new Error("Not a valid multiplier for the amount");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
value = hrpString;
|
|
21
|
+
}
|
|
22
|
+
if (!value.match(/^\d+$/))
|
|
23
|
+
throw new Error("Not a valid human readable amount");
|
|
24
|
+
const valueBN = BigInt(value);
|
|
25
|
+
const millisatoshisBN = divisor
|
|
26
|
+
? (valueBN * MILLISATS_PER_BTC) / DIVISORS[divisor]
|
|
27
|
+
: valueBN * MILLISATS_PER_BTC;
|
|
28
|
+
if ((divisor === "p" && !(valueBN % BigInt(10) === BigInt(0))) ||
|
|
29
|
+
millisatoshisBN > MAX_MILLISATS) {
|
|
30
|
+
throw new Error("Amount is outside of valid range");
|
|
31
|
+
}
|
|
32
|
+
return millisatoshisBN;
|
|
33
|
+
};
|
|
34
|
+
export const getInvoiceAmount = (bolt11) => {
|
|
35
|
+
const hrp = bolt11.match(/lnbc(\d+\w)/);
|
|
36
|
+
const bn = hrpToMillisat(hrp[1]);
|
|
37
|
+
return Number(bn);
|
|
38
|
+
};
|
|
39
|
+
export const getLnUrl = (address) => {
|
|
40
|
+
address = address.toLowerCase();
|
|
41
|
+
if (address.startsWith("lnurl1")) {
|
|
42
|
+
return address;
|
|
43
|
+
}
|
|
44
|
+
// If it's a regular url, just encode it
|
|
45
|
+
if (address.includes("://")) {
|
|
46
|
+
return hexToBech32("lnurl", address);
|
|
47
|
+
}
|
|
48
|
+
// Try to parse it as a lud16 address
|
|
49
|
+
if (address.includes("@")) {
|
|
50
|
+
const [name, domain] = address.split("@");
|
|
51
|
+
if (domain && name) {
|
|
52
|
+
return hexToBech32("lnurl", `https://${domain}/.well-known/lnurlp/${name}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
export const zapFromEvent = (response, zapper) => {
|
|
58
|
+
const responseMeta = fromPairs(response.tags);
|
|
59
|
+
let zap;
|
|
60
|
+
try {
|
|
61
|
+
zap = {
|
|
62
|
+
response,
|
|
63
|
+
invoiceAmount: getInvoiceAmount(responseMeta.bolt11),
|
|
64
|
+
request: JSON.parse(responseMeta.description),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Don't count zaps that the user requested for himself
|
|
71
|
+
if (zap.request.pubkey === zapper?.pubkey) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const { amount, lnurl } = fromPairs(zap.request.tags);
|
|
75
|
+
// Verify that the zapper actually sent the requested amount (if it was supplied)
|
|
76
|
+
if (amount && parseInt(amount) !== zap.invoiceAmount) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// If the recipient and the zapper are the same person, it's legit
|
|
80
|
+
if (responseMeta.p === response.pubkey) {
|
|
81
|
+
return zap;
|
|
82
|
+
}
|
|
83
|
+
// If the sending client provided an lnurl tag, verify that too
|
|
84
|
+
if (lnurl && lnurl !== zapper?.lnurl) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// Verify that the request actually came from the recipient's zapper
|
|
88
|
+
if (zap.response.pubkey !== zapper?.nostrPubkey) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return zap;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=Zaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Zaps.js","sourceRoot":"","sources":["../../../../util/src/Zaps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from "./Address.js";
|
|
2
|
+
export * from "./Encryptable.js";
|
|
3
|
+
export * from "./Events.js";
|
|
4
|
+
export * from "./Filters.js";
|
|
5
|
+
export * from "./Handler.js";
|
|
6
|
+
export * from "./Kinds.js";
|
|
7
|
+
export * from "./Links.js";
|
|
8
|
+
export * from "./List.js";
|
|
9
|
+
export * from "./Profile.js";
|
|
10
|
+
export * from "./Relay.js";
|
|
11
|
+
export * from "./Tags.js";
|
|
12
|
+
export * from "./Zaps.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../util/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from "./Address.js";
|
|
2
|
+
export * from "./Encryptable.js";
|
|
3
|
+
export * from "./Events.js";
|
|
4
|
+
export * from "./Filters.js";
|
|
5
|
+
export * from "./Handler.js";
|
|
6
|
+
export * from "./Kinds.js";
|
|
7
|
+
export * from "./Links.js";
|
|
8
|
+
export * from "./List.js";
|
|
9
|
+
export * from "./Profile.js";
|
|
10
|
+
export * from "./Relay.js";
|
|
11
|
+
export * from "./Tags.js";
|
|
12
|
+
export * from "./Zaps.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../util/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
|