@welshman/app 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/src/collection.cjs +24 -11
- package/build/src/collection.cjs.map +1 -1
- package/build/src/collection.mjs +24 -11
- package/build/src/collection.mjs.map +1 -1
- package/build/src/context.cjs +38 -0
- package/build/src/context.cjs.map +1 -0
- package/build/src/context.d.ts +30 -0
- package/build/src/context.mjs +33 -0
- package/build/src/context.mjs.map +1 -0
- package/build/src/core.cjs +30 -8
- package/build/src/core.cjs.map +1 -1
- package/build/src/core.d.ts +7 -9
- package/build/src/core.mjs +31 -8
- package/build/src/core.mjs.map +1 -1
- package/build/src/follows.cjs +3 -7
- package/build/src/follows.cjs.map +1 -1
- package/build/src/follows.d.ts +1 -1
- package/build/src/follows.mjs +4 -8
- package/build/src/follows.mjs.map +1 -1
- package/build/src/handles.cjs +56 -14
- package/build/src/handles.cjs.map +1 -1
- package/build/src/handles.d.ts +10 -2
- package/build/src/handles.mjs +55 -15
- package/build/src/handles.mjs.map +1 -1
- package/build/src/index.cjs +2 -8
- package/build/src/index.cjs.map +1 -1
- package/build/src/index.d.ts +2 -0
- package/build/src/index.mjs +2 -8
- package/build/src/index.mjs.map +1 -1
- package/build/src/mutes.cjs +3 -7
- package/build/src/mutes.cjs.map +1 -1
- package/build/src/mutes.d.ts +1 -1
- package/build/src/mutes.mjs +4 -8
- package/build/src/mutes.mjs.map +1 -1
- package/build/src/profiles.cjs +11 -11
- package/build/src/profiles.cjs.map +1 -1
- package/build/src/profiles.d.ts +5 -6
- package/build/src/profiles.mjs +14 -14
- package/build/src/profiles.mjs.map +1 -1
- package/build/src/relaySelections.cjs +14 -8
- package/build/src/relaySelections.cjs.map +1 -1
- package/build/src/relaySelections.d.ts +10 -4
- package/build/src/relaySelections.mjs +13 -8
- package/build/src/relaySelections.mjs.map +1 -1
- package/build/src/relays.cjs +22 -28
- package/build/src/relays.cjs.map +1 -1
- package/build/src/relays.d.ts +1 -1
- package/build/src/relays.mjs +23 -29
- package/build/src/relays.mjs.map +1 -1
- package/build/src/router.cjs +375 -0
- package/build/src/router.cjs.map +1 -0
- package/build/src/router.d.ts +197 -0
- package/build/src/router.mjs +355 -0
- package/build/src/router.mjs.map +1 -0
- package/build/src/session.cjs +3 -4
- package/build/src/session.cjs.map +1 -1
- package/build/src/session.mjs +4 -5
- package/build/src/session.mjs.map +1 -1
- package/build/src/storage.cjs +23 -13
- package/build/src/storage.cjs.map +1 -1
- package/build/src/storage.d.ts +26 -2
- package/build/src/storage.mjs +24 -14
- package/build/src/storage.mjs.map +1 -1
- package/build/src/zappers.cjs +37 -16
- package/build/src/zappers.cjs.map +1 -1
- package/build/src/zappers.d.ts +4 -3
- package/build/src/zappers.mjs +37 -17
- package/build/src/zappers.mjs.map +1 -1
- package/package.json +6 -6
package/build/src/collection.cjs
CHANGED
|
@@ -9,21 +9,34 @@ const collection = ({ name, store, getKey, load, }) => {
|
|
|
9
9
|
const indexStore = (0, store_2.withGetter)((0, store_1.derived)(store, $items => (0, lib_1.indexBy)(getKey, $items)));
|
|
10
10
|
const getItem = (key) => indexStore.get().get(key);
|
|
11
11
|
const pending = new Map();
|
|
12
|
+
const loadAttempts = new Map();
|
|
12
13
|
const loadItem = async (key, ...args) => {
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const stale = getItem(key);
|
|
15
|
+
const freshness = (0, freshness_1.getFreshness)(name, key);
|
|
16
|
+
// If we have an item, reload if it's stale
|
|
17
|
+
if (stale && freshness > (0, lib_1.now)() - 3600) {
|
|
18
|
+
return stale;
|
|
15
19
|
}
|
|
20
|
+
// If we already are loading, await and return
|
|
16
21
|
if (pending.has(key)) {
|
|
17
|
-
|
|
22
|
+
return pending.get(key).then(() => getItem(key));
|
|
18
23
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
await promise;
|
|
24
|
-
pending.delete(key);
|
|
24
|
+
const attempt = loadAttempts.get(key) || 0;
|
|
25
|
+
// Use exponential backoff to throttle attempts
|
|
26
|
+
if (freshness > (0, lib_1.now)() - Math.pow(2, attempt)) {
|
|
27
|
+
return stale;
|
|
25
28
|
}
|
|
26
|
-
|
|
29
|
+
loadAttempts.set(key, attempt + 1);
|
|
30
|
+
(0, freshness_1.setFreshness)(name, key, (0, lib_1.now)());
|
|
31
|
+
const promise = load(key, ...args);
|
|
32
|
+
pending.set(key, promise);
|
|
33
|
+
await promise;
|
|
34
|
+
pending.delete(key);
|
|
35
|
+
const fresh = getItem(key);
|
|
36
|
+
if (fresh) {
|
|
37
|
+
loadAttempts.delete(key);
|
|
38
|
+
}
|
|
39
|
+
return fresh;
|
|
27
40
|
};
|
|
28
41
|
const deriveItem = (key, ...args) => {
|
|
29
42
|
if (!key) {
|
|
@@ -31,7 +44,7 @@ const collection = ({ name, store, getKey, load, }) => {
|
|
|
31
44
|
}
|
|
32
45
|
// If we don't yet have the item, or it's stale, trigger a request for it. The derived
|
|
33
46
|
// store will update when it arrives
|
|
34
|
-
|
|
47
|
+
loadItem(key, ...args);
|
|
35
48
|
return (0, store_1.derived)(indexStore, $index => $index.get(key));
|
|
36
49
|
};
|
|
37
50
|
return { indexStore, deriveItem, loadItem, getItem };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.cjs","sourceRoot":"","sources":["../../src/collection.ts"],"names":[],"mappings":";;;AAAA,wCAA6D;AAC7D,uCAAsD;AACtD,2CAA0C;AAC1C,+CAAsD;AAE/C,MAAM,UAAU,GAAG,CAA4B,EACpD,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,GAML,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,IAAA,eAAO,EAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAA,aAAO,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"collection.cjs","sourceRoot":"","sources":["../../src/collection.ts"],"names":[],"mappings":";;;AAAA,wCAA6D;AAC7D,uCAAsD;AACtD,2CAA0C;AAC1C,+CAAsD;AAE/C,MAAM,UAAU,GAAG,CAA4B,EACpD,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,GAML,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,IAAA,eAAO,EAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAA,aAAO,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAA;IACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE9C,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,GAAG,IAAc,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,SAAS,GAAG,IAAA,wBAAY,EAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEzC,2CAA2C;QAC3C,IAAI,KAAK,IAAI,SAAS,GAAG,IAAA,SAAG,GAAE,GAAG,IAAI,EAAE;YACrC,OAAO,KAAK,CAAA;SACb;QAED,8CAA8C;QAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;SAClD;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE1C,+CAA+C;QAC/C,IAAI,SAAS,GAAG,IAAA,SAAG,GAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE;YAC5C,OAAO,KAAK,CAAA;SACb;QAED,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;QAElC,IAAA,wBAAY,EAAC,IAAI,EAAE,GAAG,EAAE,IAAA,SAAG,GAAE,CAAC,CAAA;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAElC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEzB,MAAM,OAAO,CAAA;QAEb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAE1B,IAAI,KAAK,EAAE;YACT,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACzB;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAE,GAAG,IAAc,EAAE,EAAE;QAC3D,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,IAAA,gBAAQ,EAAC,SAAS,CAAC,CAAA;SAC3B;QAED,sFAAsF;QACtF,oCAAoC;QACpC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAEtB,OAAO,IAAA,eAAO,EAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC,CAAA;IAED,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAA;AACpD,CAAC,CAAA;AAvEY,QAAA,UAAU,cAuEtB"}
|
package/build/src/collection.mjs
CHANGED
|
@@ -6,21 +6,34 @@ export const collection = ({ name, store, getKey, load, }) => {
|
|
|
6
6
|
const indexStore = withGetter(derived(store, $items => indexBy(getKey, $items)));
|
|
7
7
|
const getItem = (key) => indexStore.get().get(key);
|
|
8
8
|
const pending = new Map();
|
|
9
|
+
const loadAttempts = new Map();
|
|
9
10
|
const loadItem = async (key, ...args) => {
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const stale = getItem(key);
|
|
12
|
+
const freshness = getFreshness(name, key);
|
|
13
|
+
// If we have an item, reload if it's stale
|
|
14
|
+
if (stale && freshness > now() - 3600) {
|
|
15
|
+
return stale;
|
|
12
16
|
}
|
|
17
|
+
// If we already are loading, await and return
|
|
13
18
|
if (pending.has(key)) {
|
|
14
|
-
|
|
19
|
+
return pending.get(key).then(() => getItem(key));
|
|
15
20
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
await promise;
|
|
21
|
-
pending.delete(key);
|
|
21
|
+
const attempt = loadAttempts.get(key) || 0;
|
|
22
|
+
// Use exponential backoff to throttle attempts
|
|
23
|
+
if (freshness > now() - Math.pow(2, attempt)) {
|
|
24
|
+
return stale;
|
|
22
25
|
}
|
|
23
|
-
|
|
26
|
+
loadAttempts.set(key, attempt + 1);
|
|
27
|
+
setFreshness(name, key, now());
|
|
28
|
+
const promise = load(key, ...args);
|
|
29
|
+
pending.set(key, promise);
|
|
30
|
+
await promise;
|
|
31
|
+
pending.delete(key);
|
|
32
|
+
const fresh = getItem(key);
|
|
33
|
+
if (fresh) {
|
|
34
|
+
loadAttempts.delete(key);
|
|
35
|
+
}
|
|
36
|
+
return fresh;
|
|
24
37
|
};
|
|
25
38
|
const deriveItem = (key, ...args) => {
|
|
26
39
|
if (!key) {
|
|
@@ -28,7 +41,7 @@ export const collection = ({ name, store, getKey, load, }) => {
|
|
|
28
41
|
}
|
|
29
42
|
// If we don't yet have the item, or it's stale, trigger a request for it. The derived
|
|
30
43
|
// store will update when it arrives
|
|
31
|
-
|
|
44
|
+
loadItem(key, ...args);
|
|
32
45
|
return derived(indexStore, $index => $index.get(key));
|
|
33
46
|
};
|
|
34
47
|
return { indexStore, deriveItem, loadItem, getItem };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.mjs","sourceRoot":"","sources":["../../src/collection.ts"],"names":[],"mappings":"OAAO,EAAC,QAAQ,EAAE,OAAO,EAAgB,MAAM,cAAc;OACtD,EAAC,OAAO,EAAc,GAAG,EAAC,MAAM,eAAe;OAC/C,EAAC,UAAU,EAAC,MAAM,iBAAiB;OACnC,EAAC,YAAY,EAAE,YAAY,EAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,CAA4B,EACpD,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,GAML,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"collection.mjs","sourceRoot":"","sources":["../../src/collection.ts"],"names":[],"mappings":"OAAO,EAAC,QAAQ,EAAE,OAAO,EAAgB,MAAM,cAAc;OACtD,EAAC,OAAO,EAAc,GAAG,EAAC,MAAM,eAAe;OAC/C,EAAC,UAAU,EAAC,MAAM,iBAAiB;OACnC,EAAC,YAAY,EAAE,YAAY,EAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,CAA4B,EACpD,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,GAML,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAA;IACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE9C,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,GAAG,IAAc,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEzC,2CAA2C;QAC3C,IAAI,KAAK,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE;YACrC,OAAO,KAAK,CAAA;SACb;QAED,8CAA8C;QAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;SAClD;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE1C,+CAA+C;QAC/C,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE;YAC5C,OAAO,KAAK,CAAA;SACb;QAED,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;QAElC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAElC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEzB,MAAM,OAAO,CAAA;QAEb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAE1B,IAAI,KAAK,EAAE;YACT,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACzB;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAE,GAAG,IAAc,EAAE,EAAE;QAC3D,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAA;SAC3B;QAED,sFAAsF;QACtF,oCAAoC;QACpC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAEtB,OAAO,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC,CAAA;IAED,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAA;AACpD,CAAC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultAppContext = exports.getDefaultNetContext = void 0;
|
|
4
|
+
const lib_1 = require("@welshman/lib");
|
|
5
|
+
const net_1 = require("@welshman/net");
|
|
6
|
+
const util_1 = require("@welshman/util");
|
|
7
|
+
const core_1 = require("./core.cjs");
|
|
8
|
+
const router_1 = require("./router.cjs");
|
|
9
|
+
const session_1 = require("./session.cjs");
|
|
10
|
+
const getDefaultNetContext = (overrides = {}) => ({
|
|
11
|
+
...(0, net_1.getDefaultNetContext)(),
|
|
12
|
+
onAuth: session_1.onAuth,
|
|
13
|
+
onEvent: (url, event) => core_1.tracker.track(event.id, url),
|
|
14
|
+
isDeleted: (url, event) => core_1.repository.isDeleted(event),
|
|
15
|
+
isValid: (url, event) => (0, session_1.getSession)(event.pubkey) || ((0, util_1.isSignedEvent)(event) && (0, util_1.hasValidSignature)(event)),
|
|
16
|
+
optimizeSubscriptions: (subs) => {
|
|
17
|
+
const [withRelays, withoutRelays] = (0, lib_1.partition)(sub => sub.request.relays.length > 0, subs);
|
|
18
|
+
const filters = (0, util_1.unionFilters)(withoutRelays.flatMap(sub => sub.request.filters));
|
|
19
|
+
const selections = (0, net_1.defaultOptimizeSubscriptions)(withRelays);
|
|
20
|
+
if (filters.length > 0) {
|
|
21
|
+
for (const selection of (0, router_1.getFilterSelections)(filters)) {
|
|
22
|
+
selections.push(selection);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return selections;
|
|
26
|
+
},
|
|
27
|
+
...overrides,
|
|
28
|
+
});
|
|
29
|
+
exports.getDefaultNetContext = getDefaultNetContext;
|
|
30
|
+
const getDefaultAppContext = (overrides = {}) => ({
|
|
31
|
+
router: (0, router_1.makeRouter)(),
|
|
32
|
+
requestDelay: 50,
|
|
33
|
+
authTimeout: 300,
|
|
34
|
+
requestTimeout: 3000,
|
|
35
|
+
...overrides,
|
|
36
|
+
});
|
|
37
|
+
exports.getDefaultAppContext = getDefaultAppContext;
|
|
38
|
+
//# sourceMappingURL=context.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.cjs","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,uCAAgH;AAEhH,yCAA6E;AAE7E,qCAA0C;AAC1C,yCAAwD;AACxD,2CAA4C;AAYrC,MAAM,oBAAoB,GAAG,CAAC,YAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,GAAG,IAAA,0BAA4B,GAAE;IACjC,MAAM,EAAE,gBAAM;IACd,OAAO,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAAC,cAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;IAC3E,SAAS,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAAC,iBAAU,CAAC,SAAS,CAAC,KAAK,CAAC;IAC5E,OAAO,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAC5C,IAAA,oBAAU,EAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAA,oBAAa,EAAC,KAAK,CAAC,IAAI,IAAA,wBAAiB,EAAC,KAAK,CAAC,CAAC;IAChF,qBAAqB,EAAE,CAAC,IAAoB,EAAE,EAAE;QAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,eAAS,EAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACzF,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/E,MAAM,UAAU,GAAuB,IAAA,kCAA4B,EAAC,UAAU,CAAC,CAAA;QAE/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,KAAK,MAAM,SAAS,IAAK,IAAA,4BAAmB,EAAC,OAAO,CAAC,EAAE;gBACrD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;aAC3B;SACF;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,GAAG,SAAS;CACb,CAAC,CAAA;AArBW,QAAA,oBAAoB,wBAqB/B;AAEK,MAAM,oBAAoB,GAAG,CAAC,YAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,IAAA,mBAAU,GAAE;IACpB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,GAAG;IAChB,cAAc,EAAE,IAAI;IACpB,GAAG,SAAS;CACb,CAAC,CAAA;AANW,QAAA,oBAAoB,wBAM/B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Subscription, RelaysAndFilters, NetContext } from "@welshman/net";
|
|
2
|
+
import type { TrustedEvent } from "@welshman/util";
|
|
3
|
+
import type { Router } from './router';
|
|
4
|
+
export type AppContext = {
|
|
5
|
+
router: Router;
|
|
6
|
+
requestDelay: number;
|
|
7
|
+
authTimeout: number;
|
|
8
|
+
requestTimeout: number;
|
|
9
|
+
dufflepudUrl?: string;
|
|
10
|
+
indexerRelays?: string[];
|
|
11
|
+
};
|
|
12
|
+
export declare const getDefaultNetContext: (overrides?: Partial<NetContext>) => {
|
|
13
|
+
pool: import("@welshman/net").Pool;
|
|
14
|
+
getExecutor: (relays: string[]) => import("@welshman/net").Executor;
|
|
15
|
+
onEvent: (url: string, event: TrustedEvent) => void;
|
|
16
|
+
onAuth: (url: string, challenge: string) => void;
|
|
17
|
+
onOk: ((url: string, id: string, ok: boolean, message: string) => void) | ((...args: unknown[]) => undefined);
|
|
18
|
+
isDeleted: (url: string, event: TrustedEvent) => boolean;
|
|
19
|
+
isValid: ((url: string, event: TrustedEvent) => import("./session").Session) | ((url: string, event: TrustedEvent) => boolean);
|
|
20
|
+
matchFilters: (url: string, filters: import("@welshman/util").Filter[], event: TrustedEvent) => boolean;
|
|
21
|
+
optimizeSubscriptions: (subs: Subscription[]) => RelaysAndFilters[];
|
|
22
|
+
};
|
|
23
|
+
export declare const getDefaultAppContext: (overrides?: Partial<AppContext>) => {
|
|
24
|
+
router: Router;
|
|
25
|
+
requestDelay: number;
|
|
26
|
+
authTimeout: number;
|
|
27
|
+
requestTimeout: number;
|
|
28
|
+
dufflepudUrl?: string | undefined;
|
|
29
|
+
indexerRelays?: string[] | undefined;
|
|
30
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { partition } from "@welshman/lib";
|
|
2
|
+
import { defaultOptimizeSubscriptions, getDefaultNetContext as originalGetDefaultNetContext } from "@welshman/net";
|
|
3
|
+
import { unionFilters, isSignedEvent, hasValidSignature } from "@welshman/util";
|
|
4
|
+
import { tracker, repository } from "./core.mjs";
|
|
5
|
+
import { makeRouter, getFilterSelections } from "./router.mjs";
|
|
6
|
+
import { onAuth, getSession } from "./session.mjs";
|
|
7
|
+
export const getDefaultNetContext = (overrides = {}) => ({
|
|
8
|
+
...originalGetDefaultNetContext(),
|
|
9
|
+
onAuth: onAuth,
|
|
10
|
+
onEvent: (url, event) => tracker.track(event.id, url),
|
|
11
|
+
isDeleted: (url, event) => repository.isDeleted(event),
|
|
12
|
+
isValid: (url, event) => getSession(event.pubkey) || (isSignedEvent(event) && hasValidSignature(event)),
|
|
13
|
+
optimizeSubscriptions: (subs) => {
|
|
14
|
+
const [withRelays, withoutRelays] = partition(sub => sub.request.relays.length > 0, subs);
|
|
15
|
+
const filters = unionFilters(withoutRelays.flatMap(sub => sub.request.filters));
|
|
16
|
+
const selections = defaultOptimizeSubscriptions(withRelays);
|
|
17
|
+
if (filters.length > 0) {
|
|
18
|
+
for (const selection of getFilterSelections(filters)) {
|
|
19
|
+
selections.push(selection);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return selections;
|
|
23
|
+
},
|
|
24
|
+
...overrides,
|
|
25
|
+
});
|
|
26
|
+
export const getDefaultAppContext = (overrides = {}) => ({
|
|
27
|
+
router: makeRouter(),
|
|
28
|
+
requestDelay: 50,
|
|
29
|
+
authTimeout: 300,
|
|
30
|
+
requestTimeout: 3000,
|
|
31
|
+
...overrides,
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=context.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.mjs","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"OAAO,EAAC,SAAS,EAAC,MAAM,eAAe;OAChC,EAAC,4BAA4B,EAAE,oBAAoB,IAAI,4BAA4B,EAAC,MAAM,eAAe;OAEzG,EAAC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAC,MAAM,gBAAgB;OAEtE,EAAC,OAAO,EAAE,UAAU,EAAC;OACrB,EAAC,UAAU,EAAE,mBAAmB,EAAC;OACjC,EAAC,MAAM,EAAE,UAAU,EAAC;AAY3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,GAAG,4BAA4B,EAAE;IACjC,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;IAC3E,SAAS,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;IAC5E,OAAO,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAC5C,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChF,qBAAqB,EAAE,CAAC,IAAoB,EAAE,EAAE;QAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACzF,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/E,MAAM,UAAU,GAAuB,4BAA4B,CAAC,UAAU,CAAC,CAAA;QAE/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,KAAK,MAAM,SAAS,IAAK,mBAAmB,CAAC,OAAO,CAAC,EAAE;gBACrD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;aAC3B;SACF;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,GAAG,SAAS;CACb,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,UAAU,EAAE;IACpB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,GAAG;IAChB,cAAc,EAAE,IAAI;IACpB,GAAG,SAAS;CACb,CAAC,CAAA"}
|
package/build/src/core.cjs
CHANGED
|
@@ -1,32 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.load = exports.subscribe = exports.tracker = exports.relay = exports.events = exports.repository = void 0;
|
|
4
4
|
const lib_1 = require("@welshman/lib");
|
|
5
5
|
const util_1 = require("@welshman/util");
|
|
6
6
|
const net_1 = require("@welshman/net");
|
|
7
7
|
const store_1 = require("@welshman/store");
|
|
8
|
-
exports.env = {
|
|
9
|
-
DUFFLEPUD_URL: undefined,
|
|
10
|
-
};
|
|
11
8
|
exports.repository = new util_1.Repository();
|
|
12
9
|
exports.events = (0, store_1.createEventStore)(exports.repository);
|
|
13
10
|
exports.relay = new util_1.Relay(exports.repository);
|
|
14
11
|
exports.tracker = new net_1.Tracker();
|
|
15
12
|
const subscribe = (request) => {
|
|
16
|
-
const
|
|
13
|
+
const events = [];
|
|
14
|
+
// If we already have all results for any filter, don't send the filter to the network
|
|
15
|
+
if (request.closeOnEose) {
|
|
16
|
+
for (const filter of request.filters.splice(0)) {
|
|
17
|
+
const cardinality = (0, util_1.getFilterResultCardinality)(filter);
|
|
18
|
+
if (!(0, lib_1.isNil)(cardinality)) {
|
|
19
|
+
const results = exports.repository.query([filter]);
|
|
20
|
+
if (results.length === cardinality) {
|
|
21
|
+
for (const event of results) {
|
|
22
|
+
events.push(event);
|
|
23
|
+
}
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
request.filters.push(filter);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Make sure to query our local relay too
|
|
31
|
+
const delay = lib_1.ctx.app.requestDelay;
|
|
32
|
+
const timeout = lib_1.ctx.app.requestTimeout;
|
|
33
|
+
const authTimeout = lib_1.ctx.app.authTimeout;
|
|
34
|
+
const sub = (0, net_1.subscribe)({ delay, timeout, authTimeout, relays: [], ...request });
|
|
17
35
|
sub.emitter.on("event", (url, e) => {
|
|
18
36
|
exports.repository.publish(e);
|
|
19
37
|
});
|
|
38
|
+
// Keep cached results async so the caller can set up handlers
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
for (const event of events) {
|
|
41
|
+
sub.emitter.emit("event", util_1.LOCAL_RELAY_URL, event);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
20
44
|
return sub;
|
|
21
45
|
};
|
|
22
46
|
exports.subscribe = subscribe;
|
|
23
47
|
const load = (request) => new Promise(resolve => {
|
|
24
|
-
const sub = (0, exports.subscribe)({ closeOnEose: true, timeout:
|
|
48
|
+
const sub = (0, exports.subscribe)({ closeOnEose: true, timeout: lib_1.ctx.app.requestTimeout, ...request });
|
|
25
49
|
const events = [];
|
|
26
50
|
sub.emitter.on("event", (url, e) => events.push(e));
|
|
27
51
|
sub.emitter.on("complete", () => resolve(events));
|
|
28
52
|
});
|
|
29
53
|
exports.load = load;
|
|
30
|
-
const loadOne = async (request) => (0, lib_1.first)(await (0, exports.load)(request));
|
|
31
|
-
exports.loadOne = loadOne;
|
|
32
54
|
//# sourceMappingURL=core.cjs.map
|
package/build/src/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"core.cjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":";;;AAAA,uCAAwC;AACxC,yCAA6F;AAE7F,uCAAiE;AAEjE,2CAAgD;AAEnC,QAAA,UAAU,GAAG,IAAI,iBAAU,EAAgB,CAAA;AAE3C,QAAA,MAAM,GAAG,IAAA,wBAAgB,EAAC,kBAAU,CAAC,CAAA;AAErC,QAAA,KAAK,GAAG,IAAI,YAAK,CAAC,kBAAU,CAAC,CAAA;AAE7B,QAAA,OAAO,GAAG,IAAI,aAAO,EAAE,CAAA;AAI7B,MAAM,SAAS,GAAG,CAAC,OAAgC,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,sFAAsF;IACtF,IAAI,OAAO,CAAC,WAAW,EAAE;QACvB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC9C,MAAM,WAAW,GAAG,IAAA,iCAA0B,EAAC,MAAM,CAAC,CAAA;YAEtD,IAAI,CAAC,IAAA,WAAK,EAAC,WAAW,CAAC,EAAE;gBACvB,MAAM,OAAO,GAAG,kBAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;gBAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE;oBAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;wBAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;qBACnB;oBAED,MAAK;iBACN;aACF;YAED,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;SAC7B;KACF;IAED,yCAAyC;IACzC,MAAM,KAAK,GAAG,SAAG,CAAC,GAAG,CAAC,YAAY,CAAA;IAClC,MAAM,OAAO,GAAG,SAAG,CAAC,GAAG,CAAC,cAAc,CAAA;IACtC,MAAM,WAAW,GAAG,SAAG,CAAC,GAAG,CAAC,WAAW,CAAA;IACvC,MAAM,GAAG,GAAG,IAAA,eAAa,EAAC,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IAEhF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAW,EAAE,CAAe,EAAE,EAAE;QACvD,kBAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,8DAA8D;IAC9D,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAe,EAAE,KAAK,CAAC,CAAA;SAClD;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AA1CY,QAAA,SAAS,aA0CrB;AAEM,MAAM,IAAI,GAAG,CAAC,OAAgC,EAAE,EAAE,CACvD,IAAI,OAAO,CAAiB,OAAO,CAAC,EAAE;IACpC,MAAM,GAAG,GAAG,IAAA,iBAAS,EAAC,EAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,SAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IACvF,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAW,EAAE,CAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AACnD,CAAC,CAAC,CAAA;AAPS,QAAA,IAAI,QAOb"}
|
package/build/src/core.d.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
/// <reference types="svelte" />
|
|
2
2
|
import { Repository, Relay } from "@welshman/util";
|
|
3
|
-
import type { TrustedEvent } from "@welshman/util";
|
|
3
|
+
import type { TrustedEvent, Filter } from "@welshman/util";
|
|
4
4
|
import { Tracker } from "@welshman/net";
|
|
5
|
-
import type {
|
|
6
|
-
export declare const env: {
|
|
7
|
-
DUFFLEPUD_URL?: string;
|
|
8
|
-
[key: string]: any;
|
|
9
|
-
};
|
|
5
|
+
import type { SubscribeRequestWithHandlers } from "@welshman/net";
|
|
10
6
|
export declare const repository: Repository<TrustedEvent>;
|
|
11
7
|
export declare const events: import("svelte/store").Writable<TrustedEvent[]>;
|
|
12
8
|
export declare const relay: Relay<TrustedEvent>;
|
|
13
9
|
export declare const tracker: Tracker;
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
export type PartialSubscribeRequest = Partial<SubscribeRequestWithHandlers> & {
|
|
11
|
+
filters: Filter[];
|
|
12
|
+
};
|
|
13
|
+
export declare const subscribe: (request: PartialSubscribeRequest) => import("@welshman/net").Subscription;
|
|
14
|
+
export declare const load: (request: PartialSubscribeRequest) => Promise<TrustedEvent[]>;
|
package/build/src/core.mjs
CHANGED
|
@@ -1,26 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Repository, Relay } from "@welshman/util";
|
|
1
|
+
import { ctx, isNil } from "@welshman/lib";
|
|
2
|
+
import { Repository, Relay, LOCAL_RELAY_URL, getFilterResultCardinality } from "@welshman/util";
|
|
3
3
|
import { Tracker, subscribe as baseSubscribe } from "@welshman/net";
|
|
4
4
|
import { createEventStore } from "@welshman/store";
|
|
5
|
-
export const env = {
|
|
6
|
-
DUFFLEPUD_URL: undefined,
|
|
7
|
-
};
|
|
8
5
|
export const repository = new Repository();
|
|
9
6
|
export const events = createEventStore(repository);
|
|
10
7
|
export const relay = new Relay(repository);
|
|
11
8
|
export const tracker = new Tracker();
|
|
12
9
|
export const subscribe = (request) => {
|
|
13
|
-
const
|
|
10
|
+
const events = [];
|
|
11
|
+
// If we already have all results for any filter, don't send the filter to the network
|
|
12
|
+
if (request.closeOnEose) {
|
|
13
|
+
for (const filter of request.filters.splice(0)) {
|
|
14
|
+
const cardinality = getFilterResultCardinality(filter);
|
|
15
|
+
if (!isNil(cardinality)) {
|
|
16
|
+
const results = repository.query([filter]);
|
|
17
|
+
if (results.length === cardinality) {
|
|
18
|
+
for (const event of results) {
|
|
19
|
+
events.push(event);
|
|
20
|
+
}
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
request.filters.push(filter);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Make sure to query our local relay too
|
|
28
|
+
const delay = ctx.app.requestDelay;
|
|
29
|
+
const timeout = ctx.app.requestTimeout;
|
|
30
|
+
const authTimeout = ctx.app.authTimeout;
|
|
31
|
+
const sub = baseSubscribe({ delay, timeout, authTimeout, relays: [], ...request });
|
|
14
32
|
sub.emitter.on("event", (url, e) => {
|
|
15
33
|
repository.publish(e);
|
|
16
34
|
});
|
|
35
|
+
// Keep cached results async so the caller can set up handlers
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
for (const event of events) {
|
|
38
|
+
sub.emitter.emit("event", LOCAL_RELAY_URL, event);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
17
41
|
return sub;
|
|
18
42
|
};
|
|
19
43
|
export const load = (request) => new Promise(resolve => {
|
|
20
|
-
const sub = subscribe({ closeOnEose: true, timeout:
|
|
44
|
+
const sub = subscribe({ closeOnEose: true, timeout: ctx.app.requestTimeout, ...request });
|
|
21
45
|
const events = [];
|
|
22
46
|
sub.emitter.on("event", (url, e) => events.push(e));
|
|
23
47
|
sub.emitter.on("complete", () => resolve(events));
|
|
24
48
|
});
|
|
25
|
-
export const loadOne = async (request) => first(await load(request));
|
|
26
49
|
//# sourceMappingURL=core.mjs.map
|
package/build/src/core.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"OAAO,EAAC,KAAK,EAAC,MAAM,eAAe;
|
|
1
|
+
{"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}
|
package/build/src/follows.cjs
CHANGED
|
@@ -19,13 +19,9 @@ _a = (0, collection_1.collection)({
|
|
|
19
19
|
name: "follows",
|
|
20
20
|
store: exports.follows,
|
|
21
21
|
getKey: follows => follows.event.pubkey,
|
|
22
|
-
load: async (pubkey,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
...request,
|
|
26
|
-
relays: [...relays, ...hints],
|
|
27
|
-
filters: [{ kinds: [util_1.FOLLOWS], authors: [pubkey] }],
|
|
28
|
-
});
|
|
22
|
+
load: async (pubkey, request = {}) => {
|
|
23
|
+
await (0, relaySelections_1.loadRelaySelections)(pubkey, request);
|
|
24
|
+
await (0, core_1.load)({ ...request, filters: [{ kinds: [util_1.FOLLOWS], authors: [pubkey] }] });
|
|
29
25
|
},
|
|
30
26
|
}), exports.followsByPubkey = _a.indexStore, exports.deriveFollows = _a.deriveItem, exports.loadFollows = _a.loadItem;
|
|
31
27
|
//# sourceMappingURL=follows.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follows.cjs","sourceRoot":"","sources":["../../src/follows.ts"],"names":[],"mappings":";;;;AAAA,yCAAkE;AAGlE,2CAA8D;AAC9D,qCAAuC;AACvC,iDAAuC;AACvC,+CAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"follows.cjs","sourceRoot":"","sources":["../../src/follows.ts"],"names":[],"mappings":";;;;AAAA,yCAAkE;AAGlE,2CAA8D;AAC9D,qCAAuC;AACvC,iDAAuC;AACvC,+CAA2C;AAC3C,2DAAqD;AAExC,QAAA,OAAO,GAAG,IAAA,kBAAU,EAC/B,IAAA,0BAAkB,EAAgB,iBAAU,EAAE;IAC5C,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,cAAO,CAAC,EAAC,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;IAC/B,WAAW,EAAE,KAAK,EAAE,KAAmB,EAAE,EAAE,CACzC,IAAA,eAAQ,EACN,IAAA,uBAAgB,EAAC,KAAK,EAAE;QACtB,OAAO,EAAE,MAAM,IAAA,2BAAe,EAAC,KAAK,CAAC;KACtC,CAAC,CACH;CACJ,CAAC,CACH,CAAA;AAEY,KAIT,IAAA,uBAAU,EAAC;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,eAAO;IACd,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;IACvC,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,UAAqC,EAAE,EAAE,EAAE;QACtE,MAAM,IAAA,qCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC1C,MAAM,IAAA,WAAI,EAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,cAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAA;IAC5E,CAAC;CACF,CAAC,EAXY,uBAAe,kBACf,qBAAa,kBACf,mBAAW,eASrB"}
|
package/build/src/follows.d.ts
CHANGED
|
@@ -6,4 +6,4 @@ export declare const follows: import("svelte/store").Readable<PublishedList[]> &
|
|
|
6
6
|
};
|
|
7
7
|
export declare const followsByPubkey: import("svelte/store").Readable<Map<string, PublishedList>> & {
|
|
8
8
|
get: () => Map<string, PublishedList>;
|
|
9
|
-
}, deriveFollows: (key: import("@welshman/lib").Maybe<string>,
|
|
9
|
+
}, deriveFollows: (key: import("@welshman/lib").Maybe<string>, request?: Partial<SubscribeRequest> | undefined) => import("svelte/store").Readable<PublishedList | undefined>, loadFollows: (key: string, request?: Partial<SubscribeRequest> | undefined) => Promise<PublishedList | undefined>;
|
package/build/src/follows.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { deriveEventsMapped, withGetter } from '@welshman/store';
|
|
|
3
3
|
import { repository, load } from "./core.mjs";
|
|
4
4
|
import { collection } from "./collection.mjs";
|
|
5
5
|
import { ensurePlaintext } from "./plaintext.mjs";
|
|
6
|
-
import {
|
|
6
|
+
import { loadRelaySelections } from "./relaySelections.mjs";
|
|
7
7
|
export const follows = withGetter(deriveEventsMapped(repository, {
|
|
8
8
|
filters: [{ kinds: [FOLLOWS] }],
|
|
9
9
|
itemToEvent: item => item.event,
|
|
@@ -15,13 +15,9 @@ export const { indexStore: followsByPubkey, deriveItem: deriveFollows, loadItem:
|
|
|
15
15
|
name: "follows",
|
|
16
16
|
store: follows,
|
|
17
17
|
getKey: follows => follows.event.pubkey,
|
|
18
|
-
load: async (pubkey,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
...request,
|
|
22
|
-
relays: [...relays, ...hints],
|
|
23
|
-
filters: [{ kinds: [FOLLOWS], authors: [pubkey] }],
|
|
24
|
-
});
|
|
18
|
+
load: async (pubkey, request = {}) => {
|
|
19
|
+
await loadRelaySelections(pubkey, request);
|
|
20
|
+
await load({ ...request, filters: [{ kinds: [FOLLOWS], authors: [pubkey] }] });
|
|
25
21
|
},
|
|
26
22
|
});
|
|
27
23
|
//# sourceMappingURL=follows.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follows.mjs","sourceRoot":"","sources":["../../src/follows.ts"],"names":[],"mappings":"OAAO,EAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAC,MAAM,gBAAgB;OAG3D,EAAC,kBAAkB,EAAE,UAAU,EAAC,MAAM,iBAAiB;OACvD,EAAC,UAAU,EAAE,IAAI,EAAC;OAClB,EAAC,UAAU,EAAC;OACZ,EAAC,eAAe,EAAC;OACjB,EAAC,
|
|
1
|
+
{"version":3,"file":"follows.mjs","sourceRoot":"","sources":["../../src/follows.ts"],"names":[],"mappings":"OAAO,EAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAC,MAAM,gBAAgB;OAG3D,EAAC,kBAAkB,EAAE,UAAU,EAAC,MAAM,iBAAiB;OACvD,EAAC,UAAU,EAAE,IAAI,EAAC;OAClB,EAAC,UAAU,EAAC;OACZ,EAAC,eAAe,EAAC;OACjB,EAAC,mBAAmB,EAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAC/B,kBAAkB,CAAgB,UAAU,EAAE;IAC5C,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAC,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;IAC/B,WAAW,EAAE,KAAK,EAAE,KAAmB,EAAE,EAAE,CACzC,QAAQ,CACN,gBAAgB,CAAC,KAAK,EAAE;QACtB,OAAO,EAAE,MAAM,eAAe,CAAC,KAAK,CAAC;KACtC,CAAC,CACH;CACJ,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,EACX,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,WAAW,GACtB,GAAG,UAAU,CAAC;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;IACvC,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,UAAqC,EAAE,EAAE,EAAE;QACtE,MAAM,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC1C,MAAM,IAAI,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAA;IAC5E,CAAC;CACF,CAAC,CAAA"}
|
package/build/src/handles.cjs
CHANGED
|
@@ -1,24 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.displayHandle = exports.loadHandle = exports.deriveHandle = exports.handlesByNip05 = exports.fetchHandles = exports.
|
|
4
|
+
exports.displayHandle = exports.deriveHandleForPubkey = exports.loadHandle = exports.deriveHandle = exports.handlesByNip05 = exports.fetchHandles = exports.handles = exports.queryProfile = exports.NIP05_REGEX = void 0;
|
|
5
5
|
const store_1 = require("svelte/store");
|
|
6
6
|
const store_2 = require("@welshman/store");
|
|
7
7
|
const lib_1 = require("@welshman/lib");
|
|
8
|
-
const core_1 = require("./core.cjs");
|
|
9
8
|
const collection_1 = require("./collection.cjs");
|
|
10
9
|
const profiles_1 = require("./profiles.cjs");
|
|
11
|
-
exports.
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
exports.NIP05_REGEX = /^(?:([\w.+-]+)@)?([\w_-]+(\.[\w_-]+)+)$/;
|
|
11
|
+
async function queryProfile(nip05) {
|
|
12
|
+
const match = nip05.match(exports.NIP05_REGEX);
|
|
13
|
+
if (!match)
|
|
14
|
+
return undefined;
|
|
15
|
+
const [_, name = '_', domain] = match;
|
|
16
|
+
try {
|
|
17
|
+
const { names, relays = {}, nip46 = {} } = await (0, lib_1.fetchJson)(`https://${domain}/.well-known/nostr.json?name=${name}`);
|
|
18
|
+
const pubkey = names[name];
|
|
19
|
+
if (!pubkey) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
nip05,
|
|
24
|
+
pubkey,
|
|
25
|
+
nip46: nip46[pubkey],
|
|
26
|
+
relays: relays[pubkey],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (_e) {
|
|
30
|
+
return undefined;
|
|
17
31
|
}
|
|
18
|
-
|
|
32
|
+
}
|
|
33
|
+
exports.queryProfile = queryProfile;
|
|
34
|
+
exports.handles = (0, store_2.withGetter)((0, store_1.writable)([]));
|
|
35
|
+
const fetchHandles = async (nip05s) => {
|
|
36
|
+
const base = lib_1.ctx.app.dufflepudUrl;
|
|
19
37
|
const handlesByNip05 = new Map();
|
|
20
|
-
|
|
21
|
-
|
|
38
|
+
// Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly
|
|
39
|
+
if (base) {
|
|
40
|
+
const res = await (0, lib_1.tryCatch)(async () => await (0, lib_1.postJson)(`${base}/handle/info`, { handles: nip05s }));
|
|
41
|
+
for (const { handle: nip05, info } of (res === null || res === void 0 ? void 0 : res.data) || []) {
|
|
42
|
+
handlesByNip05.set(nip05, info);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const results = await Promise.all(nip05s.map(async (nip05) => ({ nip05, info: await (0, lib_1.tryCatch)(async () => await queryProfile(nip05)) })));
|
|
47
|
+
for (const { nip05, info } of results) {
|
|
48
|
+
if (info) {
|
|
49
|
+
handlesByNip05.set(nip05, info);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
22
52
|
}
|
|
23
53
|
return handlesByNip05;
|
|
24
54
|
};
|
|
@@ -31,13 +61,25 @@ _a = (0, collection_1.collection)({
|
|
|
31
61
|
const fresh = await (0, exports.fetchHandles)((0, lib_1.uniq)(nip05s));
|
|
32
62
|
const stale = exports.handlesByNip05.get();
|
|
33
63
|
const items = nip05s.map(nip05 => {
|
|
34
|
-
const
|
|
35
|
-
|
|
64
|
+
const newHandle = fresh.get(nip05);
|
|
65
|
+
const oldHandle = stale.get(nip05);
|
|
66
|
+
if (newHandle) {
|
|
67
|
+
stale.set(nip05, { ...newHandle, nip05 });
|
|
68
|
+
}
|
|
69
|
+
return { ...oldHandle, ...newHandle, nip05 };
|
|
36
70
|
});
|
|
37
|
-
exports.handles.
|
|
71
|
+
exports.handles.set(Array.from(stale.values()));
|
|
38
72
|
return items;
|
|
39
73
|
}),
|
|
40
74
|
}), exports.handlesByNip05 = _a.indexStore, exports.deriveHandle = _a.deriveItem, exports.loadHandle = _a.loadItem;
|
|
75
|
+
const deriveHandleForPubkey = (pubkey, request = {}) => (0, store_1.derived)([exports.handlesByNip05, (0, profiles_1.deriveProfile)(pubkey, request)], ([$handlesByNip05, $profile]) => {
|
|
76
|
+
if (!($profile === null || $profile === void 0 ? void 0 : $profile.nip05)) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
(0, exports.loadHandle)($profile.nip05);
|
|
80
|
+
return $handlesByNip05.get($profile.nip05);
|
|
81
|
+
});
|
|
82
|
+
exports.deriveHandleForPubkey = deriveHandleForPubkey;
|
|
41
83
|
const displayHandle = (handle) => handle.nip05.startsWith("_@") ? (0, lib_1.last)(handle.nip05.split("@")) : handle.nip05;
|
|
42
84
|
exports.displayHandle = displayHandle;
|
|
43
85
|
//# sourceMappingURL=handles.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handles.cjs","sourceRoot":"","sources":["../../src/handles.ts"],"names":[],"mappings":";;;;AAAA,wCAA8C;AAC9C,2CAA0C;
|
|
1
|
+
{"version":3,"file":"handles.cjs","sourceRoot":"","sources":["../../src/handles.ts"],"names":[],"mappings":"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"}
|