@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.
Files changed (69) hide show
  1. package/build/src/collection.cjs +24 -11
  2. package/build/src/collection.cjs.map +1 -1
  3. package/build/src/collection.mjs +24 -11
  4. package/build/src/collection.mjs.map +1 -1
  5. package/build/src/context.cjs +38 -0
  6. package/build/src/context.cjs.map +1 -0
  7. package/build/src/context.d.ts +30 -0
  8. package/build/src/context.mjs +33 -0
  9. package/build/src/context.mjs.map +1 -0
  10. package/build/src/core.cjs +30 -8
  11. package/build/src/core.cjs.map +1 -1
  12. package/build/src/core.d.ts +7 -9
  13. package/build/src/core.mjs +31 -8
  14. package/build/src/core.mjs.map +1 -1
  15. package/build/src/follows.cjs +3 -7
  16. package/build/src/follows.cjs.map +1 -1
  17. package/build/src/follows.d.ts +1 -1
  18. package/build/src/follows.mjs +4 -8
  19. package/build/src/follows.mjs.map +1 -1
  20. package/build/src/handles.cjs +56 -14
  21. package/build/src/handles.cjs.map +1 -1
  22. package/build/src/handles.d.ts +10 -2
  23. package/build/src/handles.mjs +55 -15
  24. package/build/src/handles.mjs.map +1 -1
  25. package/build/src/index.cjs +2 -8
  26. package/build/src/index.cjs.map +1 -1
  27. package/build/src/index.d.ts +2 -0
  28. package/build/src/index.mjs +2 -8
  29. package/build/src/index.mjs.map +1 -1
  30. package/build/src/mutes.cjs +3 -7
  31. package/build/src/mutes.cjs.map +1 -1
  32. package/build/src/mutes.d.ts +1 -1
  33. package/build/src/mutes.mjs +4 -8
  34. package/build/src/mutes.mjs.map +1 -1
  35. package/build/src/profiles.cjs +11 -11
  36. package/build/src/profiles.cjs.map +1 -1
  37. package/build/src/profiles.d.ts +5 -6
  38. package/build/src/profiles.mjs +14 -14
  39. package/build/src/profiles.mjs.map +1 -1
  40. package/build/src/relaySelections.cjs +14 -8
  41. package/build/src/relaySelections.cjs.map +1 -1
  42. package/build/src/relaySelections.d.ts +10 -4
  43. package/build/src/relaySelections.mjs +13 -8
  44. package/build/src/relaySelections.mjs.map +1 -1
  45. package/build/src/relays.cjs +22 -28
  46. package/build/src/relays.cjs.map +1 -1
  47. package/build/src/relays.d.ts +1 -1
  48. package/build/src/relays.mjs +23 -29
  49. package/build/src/relays.mjs.map +1 -1
  50. package/build/src/router.cjs +375 -0
  51. package/build/src/router.cjs.map +1 -0
  52. package/build/src/router.d.ts +197 -0
  53. package/build/src/router.mjs +355 -0
  54. package/build/src/router.mjs.map +1 -0
  55. package/build/src/session.cjs +3 -4
  56. package/build/src/session.cjs.map +1 -1
  57. package/build/src/session.mjs +4 -5
  58. package/build/src/session.mjs.map +1 -1
  59. package/build/src/storage.cjs +23 -13
  60. package/build/src/storage.cjs.map +1 -1
  61. package/build/src/storage.d.ts +26 -2
  62. package/build/src/storage.mjs +24 -14
  63. package/build/src/storage.mjs.map +1 -1
  64. package/build/src/zappers.cjs +37 -16
  65. package/build/src/zappers.cjs.map +1 -1
  66. package/build/src/zappers.d.ts +4 -3
  67. package/build/src/zappers.mjs +37 -17
  68. package/build/src/zappers.mjs.map +1 -1
  69. package/package.json +6 -6
@@ -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
- if ((0, freshness_1.getFreshness)(name, key) > (0, lib_1.now)() - 3600) {
14
- return indexStore.get().get(key);
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
- await pending.get(key);
22
+ return pending.get(key).then(() => getItem(key));
18
23
  }
19
- else {
20
- (0, freshness_1.setFreshness)(name, key, (0, lib_1.now)());
21
- const promise = load(key, ...args);
22
- pending.set(key, promise);
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
- return indexStore.get().get(key);
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
- load(key, ...args);
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;IAEpD,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,GAAG,IAAc,EAAE,EAAE;QACxD,IAAI,IAAA,wBAAY,EAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAA,SAAG,GAAE,GAAG,IAAI,EAAE;YAC1C,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SACjC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SACvB;aAAM;YACL,IAAA,wBAAY,EAAC,IAAI,EAAE,GAAG,EAAE,IAAA,SAAG,GAAE,CAAC,CAAA;YAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YAElC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAEzB,MAAM,OAAO,CAAA;YAEb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACpB;QAED,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClC,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,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAElB,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;AAlDY,QAAA,UAAU,cAkDtB"}
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"}
@@ -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
- if (getFreshness(name, key) > now() - 3600) {
11
- return indexStore.get().get(key);
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
- await pending.get(key);
19
+ return pending.get(key).then(() => getItem(key));
15
20
  }
16
- else {
17
- setFreshness(name, key, now());
18
- const promise = load(key, ...args);
19
- pending.set(key, promise);
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
- return indexStore.get().get(key);
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
- load(key, ...args);
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;IAEpD,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,GAAG,IAAc,EAAE,EAAE;QACxD,IAAI,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE;YAC1C,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SACjC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SACvB;aAAM;YACL,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;YAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YAElC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAEzB,MAAM,OAAO,CAAA;YAEb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACpB;QAED,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClC,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,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAElB,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"}
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"}
@@ -1,32 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadOne = exports.load = exports.subscribe = exports.tracker = exports.relay = exports.events = exports.repository = exports.env = void 0;
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 sub = (0, net_1.subscribe)({ delay: 50, authTimeout: 3000, ...request });
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: 3000, ...request });
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
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AACnC,yCAAgD;AAEhD,uCAAiE;AAEjE,2CAAgD;AAEnC,QAAA,GAAG,GAGZ;IACF,aAAa,EAAE,SAAS;CACzB,CAAA;AAEY,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;AAE7B,MAAM,SAAS,GAAG,CAAC,OAAyB,EAAE,EAAE;IACrD,MAAM,GAAG,GAAG,IAAA,eAAa,EAAC,EAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IAErE,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,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AARY,QAAA,SAAS,aAQrB;AAEM,MAAM,IAAI,GAAG,CAAC,OAAyB,EAAE,EAAE,CAChD,IAAI,OAAO,CAAiB,OAAO,CAAC,EAAE;IACpC,MAAM,GAAG,GAAG,IAAA,iBAAS,EAAC,EAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IACrE,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;AAEG,MAAM,OAAO,GAAG,KAAK,EAAE,OAAyB,EAAE,EAAE,CAAC,IAAA,WAAK,EAAC,MAAM,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,CAAA;AAAzE,QAAA,OAAO,WAAkE"}
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"}
@@ -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 { SubscribeRequest } from "@welshman/net";
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 declare const subscribe: (request: SubscribeRequest) => import("@welshman/net").Subscription;
15
- export declare const load: (request: SubscribeRequest) => Promise<TrustedEvent[]>;
16
- export declare const loadOne: (request: SubscribeRequest) => Promise<TrustedEvent>;
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[]>;
@@ -1,26 +1,49 @@
1
- import { first } from "@welshman/lib";
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 sub = baseSubscribe({ delay: 50, authTimeout: 3000, ...request });
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: 3000, ...request });
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
@@ -1 +1 @@
1
- {"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"OAAO,EAAC,KAAK,EAAC,MAAM,eAAe;OAC5B,EAAC,UAAU,EAAE,KAAK,EAAC,MAAM,gBAAgB;OAEzC,EAAC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAC,MAAM,eAAe;OAE1D,EAAC,gBAAgB,EAAC,MAAM,iBAAiB;AAEhD,MAAM,CAAC,MAAM,GAAG,GAGZ;IACF,aAAa,EAAE,SAAS;CACzB,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAgB,CAAA;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAyB,EAAE,EAAE;IACrD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IAErE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAW,EAAE,CAAe,EAAE,EAAE;QACvD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAyB,EAAE,EAAE,CAChD,IAAI,OAAO,CAAiB,OAAO,CAAC,EAAE;IACpC,MAAM,GAAG,GAAG,SAAS,CAAC,EAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IACrE,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;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}
@@ -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, hints = [], request = {}) => {
23
- const relays = (0, relaySelections_1.getWriteRelayUrls)(await (0, relaySelections_1.loadRelaySelections)(pubkey, hints));
24
- return (0, core_1.load)({
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,2DAAwE;AAE3D,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,KAAK,GAAG,EAAE,EAAE,UAAqC,EAAE,EAAE,EAAE;QAClF,MAAM,MAAM,GAAG,IAAA,mCAAiB,EAAC,MAAM,IAAA,qCAAmB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QAE1E,OAAO,IAAA,WAAI,EAAC;YACV,GAAG,OAAO;YACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;YAC7B,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,cAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC;SACjD,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,EAhBY,uBAAe,kBACf,qBAAa,kBACf,mBAAW,eAcrB"}
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"}
@@ -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>, hints?: any, request?: Partial<SubscribeRequest> | undefined) => import("svelte/store").Readable<PublishedList | undefined>, loadFollows: (key: string, hints?: any, request?: Partial<SubscribeRequest> | undefined) => Promise<PublishedList | undefined>;
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>;
@@ -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 { getWriteRelayUrls, loadRelaySelections } from "./relaySelections.mjs";
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, hints = [], request = {}) => {
19
- const relays = getWriteRelayUrls(await loadRelaySelections(pubkey, hints));
20
- return load({
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,iBAAiB,EAAE,mBAAmB,EAAC;AAE/C,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,KAAK,GAAG,EAAE,EAAE,UAAqC,EAAE,EAAE,EAAE;QAClF,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QAE1E,OAAO,IAAI,CAAC;YACV,GAAG,OAAO;YACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;YAC7B,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC;SACjD,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA"}
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"}
@@ -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.handlesByPubkey = exports.handles = void 0;
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.handles = (0, store_2.withGetter)((0, store_1.writable)([]));
12
- exports.handlesByPubkey = (0, store_1.derived)([profiles_1.profilesByPubkey, exports.handles], ([$profilesByPubkey, $handles]) => (0, lib_1.indexBy)($handle => $handle.pubkey, $handles.filter($handle => { var _a; return $handle.pubkey && ((_a = $profilesByPubkey.get($handle.pubkey)) === null || _a === void 0 ? void 0 : _a.nip05) === $handle.nip05; })));
13
- const fetchHandles = (handles) => {
14
- const base = core_1.env.DUFFLEPUD_URL;
15
- if (!base) {
16
- throw new Error("DUFFLEPUD_URL is required to fetch nip05 info");
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
- const res = (0, lib_1.postJson)(`${base}/handle/info`, { handles });
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
- for (const { handle, info } of (res === null || res === void 0 ? void 0 : res.data) || []) {
21
- handlesByNip05.set(handle, info);
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 handle = fresh.get(nip05) || stale.get(nip05) || {};
35
- return { ...handle, nip05 };
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.update($handles => (0, lib_1.uniqBy)($handle => $handle.nip05, [...$handles, ...items]));
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;AAC1C,uCAA4E;AAC5E,qCAA0B;AAC1B,iDAAuC;AACvC,6CAA2C;AAS9B,QAAA,OAAO,GAAG,IAAA,kBAAU,EAAC,IAAA,gBAAQ,EAAW,EAAE,CAAC,CAAC,CAAA;AAE5C,QAAA,eAAe,GAAG,IAAA,eAAO,EAAC,CAAC,2BAAgB,EAAE,eAAO,CAAC,EAAE,CAAC,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAAE,EAAE,CACpG,IAAA,aAAO,EACL,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EACzB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAC,OAAA,OAAO,CAAC,MAAM,IAAI,CAAA,MAAA,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,0CAAE,KAAK,MAAK,OAAO,CAAC,KAAK,CAAA,EAAA,CAAC,CAC7G,CACF,CAAA;AAEM,MAAM,YAAY,GAAG,CAAC,OAAiB,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,UAAG,CAAC,aAAc,CAAA;IAE/B,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;KACjE;IAED,MAAM,GAAG,GAAQ,IAAA,cAAQ,EAAC,GAAG,IAAI,cAAc,EAAE,EAAC,OAAO,EAAC,CAAC,CAAA;IAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEhD,KAAK,MAAM,EAAC,MAAM,EAAE,IAAI,EAAC,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,KAAI,EAAE,EAAE;QAC5C,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;KACjC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA;AAfY,QAAA,YAAY,gBAexB;AAEY,KAIT,IAAA,uBAAU,EAAC;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,eAAO;IACd,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK;IACxC,IAAI,EAAE,IAAA,aAAO,EAAC,GAAG,EAAE,KAAK,EAAE,MAAgB,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAA,oBAAY,EAAC,IAAA,UAAI,EAAC,MAAM,CAAC,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,sBAAc,CAAC,GAAG,EAAE,CAAA;QAClC,MAAM,KAAK,GAAa,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAEzD,OAAO,EAAC,GAAG,MAAM,EAAE,KAAK,EAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,eAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAA,YAAM,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAErF,OAAO,KAAK,CAAA;IACd,CAAC,CAAC;CACH,CAAC,EApBY,sBAAc,kBACd,oBAAY,kBACd,kBAAU,eAkBpB;AAEK,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE,CAC9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,UAAI,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;AADjE,QAAA,aAAa,iBACoD"}
1
+ {"version":3,"file":"handles.cjs","sourceRoot":"","sources":["../../src/handles.ts"],"names":[],"mappings":"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"}