@libp2p/devtools-metrics 0.2.0 → 0.2.1-151bc46fb

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 (58) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/src/index.d.ts +24 -95
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +66 -131
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/rpc/codecs/cid.d.ts +4 -0
  7. package/dist/src/rpc/codecs/cid.d.ts.map +1 -0
  8. package/dist/src/rpc/codecs/cid.js +8 -0
  9. package/dist/src/rpc/codecs/cid.js.map +1 -0
  10. package/dist/src/rpc/codecs/custom-progress-event.d.ts +4 -0
  11. package/dist/src/rpc/codecs/custom-progress-event.d.ts.map +1 -0
  12. package/dist/src/rpc/codecs/custom-progress-event.js +15 -0
  13. package/dist/src/rpc/codecs/custom-progress-event.js.map +1 -0
  14. package/dist/src/rpc/codecs/multiaddr.d.ts +4 -0
  15. package/dist/src/rpc/codecs/multiaddr.d.ts.map +1 -0
  16. package/dist/src/rpc/codecs/multiaddr.js +8 -0
  17. package/dist/src/rpc/codecs/multiaddr.js.map +1 -0
  18. package/dist/src/rpc/codecs/peer-id.d.ts +4 -0
  19. package/dist/src/rpc/codecs/peer-id.d.ts.map +1 -0
  20. package/dist/src/rpc/codecs/peer-id.js +9 -0
  21. package/dist/src/rpc/codecs/peer-id.js.map +1 -0
  22. package/dist/src/rpc/index.d.ts +99 -0
  23. package/dist/src/rpc/index.d.ts.map +1 -0
  24. package/dist/src/rpc/index.js +11 -0
  25. package/dist/src/rpc/index.js.map +1 -0
  26. package/dist/src/rpc/rpc.d.ts +4 -0
  27. package/dist/src/rpc/rpc.d.ts.map +1 -0
  28. package/dist/src/rpc/rpc.js +51 -0
  29. package/dist/src/rpc/rpc.js.map +1 -0
  30. package/dist/src/utils/debounce.d.ts +2 -0
  31. package/dist/src/utils/debounce.d.ts.map +1 -0
  32. package/dist/src/utils/debounce.js +21 -0
  33. package/dist/src/utils/debounce.js.map +1 -0
  34. package/dist/src/utils/get-peers.d.ts +9 -0
  35. package/dist/src/utils/get-peers.d.ts.map +1 -0
  36. package/dist/src/utils/get-peers.js +42 -0
  37. package/dist/src/utils/get-peers.js.map +1 -0
  38. package/dist/src/utils/get-self.d.ts +8 -0
  39. package/dist/src/utils/get-self.d.ts.map +1 -0
  40. package/dist/src/utils/get-self.js +13 -0
  41. package/dist/src/utils/get-self.js.map +1 -0
  42. package/dist/src/utils/to-object.d.ts +2 -0
  43. package/dist/src/utils/to-object.d.ts.map +1 -0
  44. package/dist/src/utils/to-object.js +8 -0
  45. package/dist/src/utils/to-object.js.map +1 -0
  46. package/package.json +34 -8
  47. package/src/index.ts +101 -257
  48. package/src/rpc/codecs/cid.ts +9 -0
  49. package/src/rpc/codecs/custom-progress-event.ts +17 -0
  50. package/src/rpc/codecs/multiaddr.ts +10 -0
  51. package/src/rpc/codecs/peer-id.ts +11 -0
  52. package/src/rpc/index.ts +122 -0
  53. package/src/rpc/rpc.ts +59 -0
  54. package/src/utils/debounce.ts +23 -0
  55. package/src/utils/get-peers.ts +53 -0
  56. package/src/utils/get-self.ts +21 -0
  57. package/src/utils/to-object.ts +9 -0
  58. package/dist/typedoc-urls.json +0 -46
@@ -0,0 +1,10 @@
1
+ import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'
2
+ import type { Multiaddr } from '@multiformats/multiaddr'
3
+ import type { ValueCodec } from 'it-rpc'
4
+
5
+ export const multiaddrCodec: ValueCodec<Multiaddr> = {
6
+ type: 4097,
7
+ canEncode: (val) => isMultiaddr(val),
8
+ encode: (val) => val.bytes,
9
+ decode: (buf) => multiaddr(buf)
10
+ }
@@ -0,0 +1,11 @@
1
+ import { isPeerId } from '@libp2p/interface'
2
+ import { peerIdFromBytes } from '@libp2p/peer-id'
3
+ import type { PeerId } from '@libp2p/interface'
4
+ import type { ValueCodec } from 'it-rpc'
5
+
6
+ export const peerIdCodec: ValueCodec<PeerId> = {
7
+ type: 4098,
8
+ canEncode: (val) => isPeerId(val),
9
+ encode: (val) => val.toBytes(),
10
+ decode: (buf) => peerIdFromBytes(buf)
11
+ }
@@ -0,0 +1,122 @@
1
+ import { cidCodec } from './codecs/cid.js'
2
+ import { customProgressEventCodec } from './codecs/custom-progress-event.js'
3
+ import { multiaddrCodec } from './codecs/multiaddr.js'
4
+ import { peerIdCodec } from './codecs/peer-id.js'
5
+ import type { ContentRouting, PeerId, PeerRouting, AbortOptions } from '@libp2p/interface'
6
+ import type { OpenConnectionOptions } from '@libp2p/interface-internal'
7
+ import type { Multiaddr } from '@multiformats/multiaddr'
8
+ import type { ValueCodec } from 'it-rpc'
9
+
10
+ export const valueCodecs: Array<ValueCodec<any>> = [
11
+ cidCodec,
12
+ multiaddrCodec,
13
+ peerIdCodec,
14
+ customProgressEventCodec
15
+ ]
16
+
17
+ export interface NodeAddress {
18
+ multiaddr: Multiaddr
19
+ listen?: boolean
20
+ announce?: boolean
21
+ observed?: boolean
22
+ default?: boolean
23
+ }
24
+
25
+ export interface NodeStatus {
26
+ peerId: PeerId
27
+ agent?: string
28
+ addresses: NodeAddress[]
29
+ protocols: string[]
30
+ }
31
+
32
+ export interface PeerAddress {
33
+ multiaddr: Multiaddr
34
+ isConnected?: boolean
35
+ isCertified?: boolean
36
+ }
37
+
38
+ export interface Peer {
39
+ /**
40
+ * The identifier of the remote peer
41
+ */
42
+ id: PeerId
43
+
44
+ /**
45
+ * The list of addresses the peer has that we know about
46
+ */
47
+ addresses: PeerAddress[]
48
+
49
+ /**
50
+ * Any peer store tags the peer has
51
+ */
52
+ tags: Record<string, number>
53
+
54
+ /**
55
+ * Any peer store metadata the peer has
56
+ */
57
+ metadata: Record<string, string>
58
+
59
+ /**
60
+ * The protocols the peer supports, if known
61
+ */
62
+ protocols: string[]
63
+ }
64
+
65
+ /**
66
+ * RPC operations exposed by the metrics
67
+ */
68
+ export interface MetricsRPC {
69
+ /**
70
+ * Called by DevTools on initial connect
71
+ */
72
+ init(options?: AbortOptions): Promise<{ self: Peer, peers: Peer[], debug: string }>
73
+
74
+ /**
75
+ * Update the currently active debugging namespaces
76
+ */
77
+ setDebug(namespace?: string): Promise<void>
78
+
79
+ /**
80
+ * Open a connection to the passed peer or multiaddr
81
+ */
82
+ openConnection(peerIdOrMultiaddr: string, options?: OpenConnectionOptions): Promise<void>
83
+
84
+ /**
85
+ * Close connections open to the specified peer
86
+ */
87
+ closeConnection(peerId: PeerId, options?: AbortOptions): Promise<void>
88
+
89
+ /**
90
+ * Make content routing queries
91
+ */
92
+ contentRouting: ContentRouting
93
+
94
+ /**
95
+ * Make peer routing queries
96
+ */
97
+ peerRouting: PeerRouting
98
+ }
99
+
100
+ export interface DevToolsEvents {
101
+ /**
102
+ * Node metrics have been updated
103
+ */
104
+ 'metrics': CustomEvent<Record<string, any>>
105
+
106
+ /**
107
+ * The node's status has changed - new addresses and/or protocols, etc
108
+ */
109
+ 'self': CustomEvent<Peer>
110
+
111
+ /**
112
+ * The node's connected peers have changed
113
+ */
114
+ 'peers': CustomEvent<Peer[]>
115
+ }
116
+
117
+ /**
118
+ * RPC operations exposed by the DevTools
119
+ */
120
+ export interface DevToolsRPC {
121
+ safeDispatchEvent<Detail>(type: keyof DevToolsEvents, detail?: CustomEventInit<Detail>): Promise<void>
122
+ }
package/src/rpc/rpc.ts ADDED
@@ -0,0 +1,59 @@
1
+ import { enable, disable } from '@libp2p/logger'
2
+ import { peerIdFromString } from '@libp2p/peer-id'
3
+ import { multiaddr } from '@multiformats/multiaddr'
4
+ import { getPeers } from '../utils/get-peers.js'
5
+ import { getSelf } from '../utils/get-self.js'
6
+ import type { MetricsRPC } from './index.js'
7
+ import type { DevToolsMetricsComponents } from '../index.js'
8
+ import type { PeerId } from '@libp2p/interface'
9
+ import type { OpenConnectionOptions } from '@libp2p/interface-internal'
10
+ import type { Multiaddr } from '@multiformats/multiaddr'
11
+ import type { AbortOptions } from 'it-pushable'
12
+
13
+ export function metricsRpc (components: DevToolsMetricsComponents): MetricsRPC {
14
+ const log = components.logger.forComponent('libp2p:devtools-metrics:metrics-rpc')
15
+
16
+ return {
17
+ init: async () => {
18
+ return {
19
+ self: await getSelf(components),
20
+ peers: await getPeers(components, log),
21
+ debug: localStorage.getItem('debug') ?? ''
22
+ }
23
+ },
24
+ setDebug: async (namespace?: string) => {
25
+ if (namespace?.length != null && namespace?.length > 0) {
26
+ enable(namespace)
27
+ localStorage.setItem('debug', namespace)
28
+ } else {
29
+ disable()
30
+ localStorage.removeItem('debug')
31
+ }
32
+ },
33
+ openConnection: async (peerIdOrMultiaddr: string, options?: OpenConnectionOptions) => {
34
+ let peer: PeerId | Multiaddr
35
+
36
+ try {
37
+ peer = peerIdFromString(peerIdOrMultiaddr)
38
+ } catch {
39
+ peer = multiaddr(peerIdOrMultiaddr)
40
+ }
41
+
42
+ await components.connectionManager.openConnection(peer, options)
43
+ },
44
+ closeConnection: async (peerId: PeerId, options?: AbortOptions) => {
45
+ await Promise.all(
46
+ components.connectionManager.getConnections(peerId)
47
+ .map(async connection => {
48
+ try {
49
+ await connection.close(options)
50
+ } catch (err: any) {
51
+ connection.abort(err)
52
+ }
53
+ })
54
+ )
55
+ },
56
+ contentRouting: components.contentRouting,
57
+ peerRouting: components.peerRouting
58
+ }
59
+ }
@@ -0,0 +1,23 @@
1
+ export function debounce (callback: () => void, wait: number = 100): () => void {
2
+ let timeout: ReturnType<typeof setTimeout>
3
+ let start: number | undefined
4
+
5
+ return (): void => {
6
+ if (start == null) {
7
+ start = Date.now()
8
+ }
9
+
10
+ if (timeout != null && Date.now() - start > wait) {
11
+ clearTimeout(timeout)
12
+ start = undefined
13
+ callback()
14
+ return
15
+ }
16
+
17
+ clearTimeout(timeout)
18
+ timeout = setTimeout(() => {
19
+ start = undefined
20
+ callback()
21
+ }, wait)
22
+ }
23
+ }
@@ -0,0 +1,53 @@
1
+ import { base64 } from 'multiformats/bases/base64'
2
+ import { toObject } from './to-object.js'
3
+ import type { Peer } from '../rpc/index.js'
4
+ import type { Logger, PeerStore } from '@libp2p/interface'
5
+ import type { ConnectionManager } from '@libp2p/interface-internal'
6
+
7
+ export interface Components {
8
+ connectionManager: ConnectionManager
9
+ peerStore: PeerStore
10
+ }
11
+
12
+ export async function getPeers (components: Components, log: Logger): Promise<Peer[]> {
13
+ const peers: Peer[] = []
14
+ const connections = components.connectionManager.getConnectionsMap()
15
+ const connectedAddresses = [...connections.values()].flatMap(conn => conn).map(conn => conn.remoteAddr.toString())
16
+
17
+ for (const [peerId, conns] of connections.entries()) {
18
+ try {
19
+ const peer = await components.peerStore.get(peerId)
20
+
21
+ peers.push({
22
+ id: peerId,
23
+ addresses: peer.addresses.map(({ isCertified, multiaddr }) => {
24
+ return {
25
+ multiaddr,
26
+ isCertified,
27
+ isConnected: connectedAddresses.includes(multiaddr.toString())
28
+ }
29
+ }),
30
+ protocols: [...peer.protocols],
31
+ tags: toObject(peer.tags, (t) => t.value),
32
+ metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
33
+ })
34
+ } catch (err) {
35
+ log.error('could not load peer data from peer store', err)
36
+
37
+ peers.push({
38
+ id: peerId,
39
+ addresses: conns.map(conn => {
40
+ return {
41
+ multiaddr: conn.remoteAddr,
42
+ isConnected: connectedAddresses.includes(conn.remoteAddr.toString())
43
+ }
44
+ }),
45
+ protocols: [],
46
+ tags: {},
47
+ metadata: {}
48
+ })
49
+ }
50
+ }
51
+
52
+ return peers
53
+ }
@@ -0,0 +1,21 @@
1
+ import { base64 } from 'multiformats/bases/base64'
2
+ import { toObject } from './to-object.js'
3
+ import type { Peer } from '../rpc/index.js'
4
+ import type { PeerId, PeerStore } from '@libp2p/interface'
5
+
6
+ export interface Components {
7
+ peerId: PeerId
8
+ peerStore: PeerStore
9
+ }
10
+
11
+ export async function getSelf (components: Components): Promise<Peer> {
12
+ const peer = await components.peerStore.get(components.peerId)
13
+
14
+ return {
15
+ id: peer.id,
16
+ addresses: peer.addresses,
17
+ protocols: [...peer.protocols],
18
+ tags: toObject(peer.tags, (t) => t.value),
19
+ metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
20
+ }
21
+ }
@@ -0,0 +1,9 @@
1
+ export function toObject <T, R> (map: Map<string, T>, transform: (value: T) => R): Record<string, R> {
2
+ const output: Record<string, any> = {}
3
+
4
+ for (const [key, value] of map.entries()) {
5
+ output[key] = transform(value)
6
+ }
7
+
8
+ return output
9
+ }
@@ -1,46 +0,0 @@
1
- {
2
- "Address": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Address.html",
3
- ".:Address": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Address.html",
4
- "CopyToClipboardMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.CopyToClipboardMessage.html",
5
- ".:CopyToClipboardMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.CopyToClipboardMessage.html",
6
- "DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
7
- ".:DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
8
- "DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
9
- ".:DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
10
- "EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
11
- ".:EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
12
- "IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
13
- ".:IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
14
- "MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
15
- ".:MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
16
- "PageLoadedMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PageLoadedMessage.html",
17
- ".:PageLoadedMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PageLoadedMessage.html",
18
- "Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
19
- ".:Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
20
- "PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
21
- ".:PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
22
- "PermissionsErrorMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PermissionsErrorMessage.html",
23
- ".:PermissionsErrorMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PermissionsErrorMessage.html",
24
- "SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
25
- ".:SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
26
- "SelfPeer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfPeer.html",
27
- ".:SelfPeer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfPeer.html",
28
- "ApplicationMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.ApplicationMessage.html",
29
- ".:ApplicationMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.ApplicationMessage.html",
30
- "DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
31
- ".:DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
32
- "WorkerMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.WorkerMessage.html",
33
- ".:WorkerMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.WorkerMessage.html",
34
- "LIBP2P_DEVTOOLS_METRICS_KEY": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.LIBP2P_DEVTOOLS_METRICS_KEY.html",
35
- ".:LIBP2P_DEVTOOLS_METRICS_KEY": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.LIBP2P_DEVTOOLS_METRICS_KEY.html",
36
- "SOURCE_CONTENT_SCRIPT": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_CONTENT_SCRIPT.html",
37
- ".:SOURCE_CONTENT_SCRIPT": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_CONTENT_SCRIPT.html",
38
- "SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
39
- ".:SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
40
- "SOURCE_METRICS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_METRICS.html",
41
- ".:SOURCE_METRICS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_METRICS.html",
42
- "SOURCE_SERVICE_WORKER": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_SERVICE_WORKER.html",
43
- ".:SOURCE_SERVICE_WORKER": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_SERVICE_WORKER.html",
44
- "devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html",
45
- ".:devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html"
46
- }