diff --git a/README.md b/README.md index fb174c30f7fe7428f13ad2ee7bdb3f973caad5e2..3f6b03cbf75a6fbc3ccdd2d7aec4de791e71a1dc 100644 --- a/README.md +++ b/README.md @@ -42,5 +42,4 @@ npx tsx src/indexer/start.ts ## TODO -When using Kubo node, libp2p is not needed at all. Insert pubkey instead of ss58 address if we want data to be compatible across networks diff --git a/package.json b/package.json index cb83a93a3a85945ebc3e6cf8d189469d81d1bedd..7c9684fdb7b494db735514e29bece049cb7732fe 100644 --- a/package.json +++ b/package.json @@ -13,19 +13,11 @@ "format": "prettier --write src/" }, "dependencies": { - "@chainsafe/libp2p-gossipsub": "^13.0.0", - "@chainsafe/libp2p-noise": "^15.0.0", - "@libp2p/bootstrap": "^10.0.16", - "@libp2p/mplex": "^10.0.18", - "@libp2p/ping": "^1.0.14", - "@libp2p/tcp": "^9.0.18", - "@libp2p/webtransport": "^4.0.21", "@multiformats/multiaddr": "^12.2.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", "buffer": "^6.0.3", "kubo-rpc-client": "^3.0.4", - "libp2p": "^1.3.0", "multiformats": "^13.1.0", "pg": "^8.11.5", "pretty-bytes": "^6.1.1", @@ -33,8 +25,6 @@ "vue-router": "^4.3.0" }, "devDependencies": { - "@libp2p/interface": "^1.1.4", - "@libp2p/interface-pubsub": "^4.0.1", "@rushstack/eslint-patch": "^1.3.3", "@tsconfig/node20": "^20.1.2", "@types/node": "^20.11.28", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7035552d741ff1b8a8d81f943ea487e66bd6973..41e30724bdcb170b6b8b20549baef63cfa88ad05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,27 +5,6 @@ settings: excludeLinksFromLockfile: false dependencies: - '@chainsafe/libp2p-gossipsub': - specifier: ^13.0.0 - version: 13.0.0 - '@chainsafe/libp2p-noise': - specifier: ^15.0.0 - version: 15.0.0 - '@libp2p/bootstrap': - specifier: ^10.0.16 - version: 10.0.18 - '@libp2p/mplex': - specifier: ^10.0.18 - version: 10.0.18 - '@libp2p/ping': - specifier: ^1.0.14 - version: 1.0.14 - '@libp2p/tcp': - specifier: ^9.0.18 - version: 9.0.18 - '@libp2p/webtransport': - specifier: ^4.0.21 - version: 4.0.23 '@multiformats/multiaddr': specifier: ^12.2.1 version: 12.2.1 @@ -41,9 +20,6 @@ dependencies: kubo-rpc-client: specifier: ^3.0.4 version: 3.0.4 - libp2p: - specifier: ^1.3.0 - version: 1.3.2 multiformats: specifier: ^13.1.0 version: 13.1.0 @@ -61,12 +37,6 @@ dependencies: version: 4.3.0(vue@3.4.21) devDependencies: - '@libp2p/interface': - specifier: ^1.1.4 - version: 1.1.6 - '@libp2p/interface-pubsub': - specifier: ^4.0.1 - version: 4.0.1 '@rushstack/eslint-patch': specifier: ^1.3.3 version: 1.10.1 @@ -152,62 +122,9 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@chainsafe/as-chacha20poly1305@0.1.0: - resolution: {integrity: sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==} - dev: false - - /@chainsafe/as-sha256@0.4.1: - resolution: {integrity: sha512-IqeeGwQihK6Y2EYLFofqs2eY2ep1I2MvQXHzOAI+5iQN51OZlUkrLgyAugu2x86xZewDk5xas7lNczkzFzF62w==} - dev: false - /@chainsafe/is-ip@2.0.2: resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==} - /@chainsafe/libp2p-gossipsub@13.0.0: - resolution: {integrity: sha512-2q+v429uZjMl6N3d+j9QCMj8YO0aiYvLSN1t0aTdpMXQHCHLJaaT9PtNn845B1Li7/uZjYESmikgVt8r7keH0w==} - engines: {npm: '>=8.7.0'} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/interface-internal': 1.0.11 - '@libp2p/peer-id': 4.0.9 - '@libp2p/pubsub': 9.0.13 - '@multiformats/multiaddr': 12.2.1 - denque: 2.1.0 - it-length-prefixed: 9.0.4 - it-pipe: 3.0.1 - it-pushable: 3.2.3 - multiformats: 13.1.0 - protons-runtime: 5.4.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@chainsafe/libp2p-noise@15.0.0: - resolution: {integrity: sha512-O8Y/WVU4J/qrnG72jwVhbmdXiBzv1dT9B3PMClCRmZ9z/5vVPEGRVXE/SVYeGF3bNuBTLoh+F+GaKG/9UHlMhg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@chainsafe/as-chacha20poly1305': 0.1.0 - '@chainsafe/as-sha256': 0.4.1 - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - '@noble/ciphers': 0.4.1 - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - it-length-prefixed: 9.0.4 - it-length-prefixed-stream: 1.1.6 - it-pair: 2.0.6 - it-pipe: 3.0.1 - it-stream-types: 2.0.1 - protons-runtime: 5.4.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - wherearewe: 2.0.1 - dev: false - /@chainsafe/netmask@2.0.0: resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} dependencies: @@ -716,15 +633,6 @@ packages: /@leichtgewicht/ip-codec@2.0.5: resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - /@libp2p/bootstrap@10.0.18: - resolution: {integrity: sha512-9kyp4TeANlgm8TSMPyKOhF6298PjkSRb1glbVJj+mb8Cpyb0QOuiGUiUK5+cQMDKFRNpTpeVe42k9dNb3hlAtA==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - '@multiformats/mafmt': 12.1.6 - '@multiformats/multiaddr': 12.2.1 - dev: false - /@libp2p/crypto@1.0.17: resolution: {integrity: sha512-Oeg0Eb/EvAho0gVkOgemXEgrVxWaT3x/DpFgkBdZ9qGxwq75w/E/oPc7souqBz+l1swfz37GWnwV7bIb4Xv5Ag==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -740,19 +648,6 @@ packages: uint8arrays: 4.0.10 dev: false - /@libp2p/crypto@4.0.5: - resolution: {integrity: sha512-gV5Lu+BP08wp0UkUTffJgy/M/Q0Q8cqjAYnapk/scZXYgN3M5cMRooX2b7FLkjR/aieAeMtf5YLoKJNyU27qSQ==} - dependencies: - '@libp2p/interface': 1.1.6 - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - asn1js: 3.0.5 - multiformats: 13.1.0 - protons-runtime: 5.4.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - dev: false - /@libp2p/interface-connection@4.0.0: resolution: {integrity: sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -763,26 +658,6 @@ packages: it-stream-types: 1.0.5 uint8arraylist: 2.4.8 - /@libp2p/interface-connection@5.1.1: - resolution: {integrity: sha512-ytknMbuuNW72LYMmTP7wFGP5ZTaUSGBCmV9f+uQ55XPcFHtKXLtKWVU/HE8IqPmwtyU8AO7veGoJ/qStMHNRVA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.2.1 - it-stream-types: 2.0.1 - uint8arraylist: 2.4.8 - dev: true - - /@libp2p/interface-internal@1.0.11: - resolution: {integrity: sha512-9AMgDKl3vodiCaJ3ffrVbIJml5LpVhNhiABRrvBar8cCDnQXyV7Tn2vKNyyIGIBoMOi6gMV4iyELofsP0HkkRg==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/peer-collections': 5.1.9 - '@multiformats/multiaddr': 12.2.1 - uint8arraylist: 2.4.8 - dev: false - /@libp2p/interface-keychain@2.0.5: resolution: {integrity: sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -818,17 +693,6 @@ packages: it-pushable: 3.2.3 uint8arraylist: 2.4.8 - /@libp2p/interface-pubsub@4.0.1: - resolution: {integrity: sha512-PIc5V/J98Yr1ZTHh8lQshP7GdVUh+pKNIqj6wGaDmXs8oQLB40qKCjcpHQNlAnv2e1Bh9mEH2GXv5sGZOA651A==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@libp2p/interface-connection': 5.1.1 - '@libp2p/interface-peer-id': 2.0.2 - '@libp2p/interfaces': 3.3.2 - it-pushable: 3.2.3 - uint8arraylist: 2.4.8 - dev: true - /@libp2p/interface@1.1.6: resolution: {integrity: sha512-CLz6TAZf+Mw1PCIU8pjMIct1uh3A1fIene2/t+E57Tw4uJLCBJE9CLed/Opxliy5RH0e32Aa6bi4QSXtkJTK7A==} dependencies: @@ -856,65 +720,6 @@ packages: - supports-color dev: false - /@libp2p/logger@4.0.9: - resolution: {integrity: sha512-eGjFvMGA2FtNrnQuI6YwYY5jviA00lTMAKi8pF3eH0TCnEokSYJ9LxBLwZNgIzrWuwZwO+sf4SsY1YBEisFf5Q==} - dependencies: - '@libp2p/interface': 1.1.6 - '@multiformats/multiaddr': 12.2.1 - debug: 4.3.4 - interface-datastore: 8.2.11 - multiformats: 13.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/mplex@10.0.18: - resolution: {integrity: sha512-KoMFye2ameya9GNXWjY07eM5AQg0a2iTB3muCb29Z8GhtFME41awOHlYMjMdwEaShkxwnXRjDRyIGc6BS2z0wA==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/utils': 5.2.8 - it-pipe: 3.0.1 - it-pushable: 3.2.3 - it-stream-types: 2.0.1 - uint8-varint: 2.0.4 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/multistream-select@5.1.6: - resolution: {integrity: sha512-IlGnEs5/xkk5+zMWRaI+gF7XzzyJqiNQIzSqBiE/Q+zq1VrhdqRyRYriBgwxd6eJHq3+9byUCllfMN2E4bzlSw==} - dependencies: - '@libp2p/interface': 1.1.6 - it-length-prefixed: 9.0.4 - it-length-prefixed-stream: 1.1.6 - it-stream-types: 2.0.1 - p-defer: 4.0.1 - race-signal: 1.0.2 - uint8-varint: 2.0.4 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - dev: false - - /@libp2p/peer-collections@5.1.9: - resolution: {integrity: sha512-xaNV+YXPaYN9Woyd/5c//ppTCi3KnseZRRxAMT1pXYUB3uL8cfMZSWnQbE8h8Q0kZw5BXrO13xPPVU7OtAr67w==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - dev: false - - /@libp2p/peer-id-factory@4.0.9: - resolution: {integrity: sha512-GdMhdUxbVHZgNWn7nOh/Knc4gwxwraJvUqPBn4sxEBInAO+nQY0mtIbOr7sk1c/9rlkV5REDJMDIPVDXC+cPVQ==} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - protons-runtime: 5.4.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - dev: false - /@libp2p/peer-id@2.0.4: resolution: {integrity: sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -925,130 +730,6 @@ packages: uint8arrays: 4.0.10 dev: false - /@libp2p/peer-id@4.0.9: - resolution: {integrity: sha512-XrGimVDNym7BXPGBJetC1RyNU8N22NJLBzjM1FXADnlUsJZyKRZOkE8wRTqpLvVptnQImqobe1PVPkirjxZEwA==} - dependencies: - '@libp2p/interface': 1.1.6 - multiformats: 13.1.0 - uint8arrays: 5.0.3 - dev: false - - /@libp2p/peer-record@7.0.12: - resolution: {integrity: sha512-1U1GBgOzlncEl3ZJ5LFu/tNk9ZNchjCD6GsNXm75eCXMEXD/MwLsUZVT742uvwQC9AVaQMXw3iYz+P5XUPuyNw==} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - '@libp2p/utils': 5.2.8 - '@multiformats/multiaddr': 12.2.1 - protons-runtime: 5.4.0 - uint8-varint: 2.0.4 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/peer-store@10.0.13: - resolution: {integrity: sha512-/YYCb+cU4plc0qu71Lec7BqSfOXWC5c1Mj5UX48BDpJevIxfLATs7YfBoGvqLSsir97PMDX9S6t1zuhh+pWkOQ==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/peer-collections': 5.1.9 - '@libp2p/peer-id': 4.0.9 - '@libp2p/peer-record': 7.0.12 - '@multiformats/multiaddr': 12.2.1 - interface-datastore: 8.2.11 - it-all: 3.0.4 - mortice: 3.0.4 - multiformats: 13.1.0 - protons-runtime: 5.4.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/ping@1.0.14: - resolution: {integrity: sha512-AK6HfXDuEulH4rHD3axNk1l+q0oDdKaXJ2EbR/rl0CF8/ys/xkWHXoQnRwP6RqMjdx26Q7PhuJ/HlasaIkb4pw==} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/interface-internal': 1.0.11 - '@multiformats/multiaddr': 12.2.1 - it-first: 3.0.4 - it-pipe: 3.0.1 - uint8arrays: 5.0.3 - dev: false - - /@libp2p/pubsub@9.0.13: - resolution: {integrity: sha512-t+4ulBUJ1R/s1RAN27JrbO9ZN5Bbg0YKDsRJPZtCNRWhuGe1jo6myl+boRFTFz+aF6/K9iU2FhPUpKgMKC1XIw==} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/interface-internal': 1.0.11 - '@libp2p/peer-collections': 5.1.9 - '@libp2p/peer-id': 4.0.9 - '@libp2p/utils': 5.2.8 - it-length-prefixed: 9.0.4 - it-pipe: 3.0.1 - it-pushable: 3.2.3 - multiformats: 13.1.0 - p-queue: 8.0.1 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/tcp@9.0.18: - resolution: {integrity: sha512-1Z3vKO1nSMo1sJOnLuHoS/yEXa9bdyT6/Eh/Q4lho1akNWds3PB06iwYHMhlYbh4XjuJVzAorvvHuVpzfb+DLA==} - dependencies: - '@libp2p/interface': 1.1.6 - '@libp2p/utils': 5.2.8 - '@multiformats/mafmt': 12.1.6 - '@multiformats/multiaddr': 12.2.1 - '@types/sinon': 17.0.3 - stream-to-it: 0.2.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/utils@5.2.8: - resolution: {integrity: sha512-gAATwKXh3UhRb6hQOhezT6uC8os6VRt4UkK8S2gQhcjTDaFW4cbfF0oQ3gkXpPJYi/rm8t9JCZmv1btbd5O+jA==} - dependencies: - '@chainsafe/is-ip': 2.0.2 - '@libp2p/interface': 1.1.6 - '@libp2p/logger': 4.0.9 - '@multiformats/multiaddr': 12.2.1 - '@multiformats/multiaddr-matcher': 1.2.0 - delay: 6.0.0 - get-iterator: 2.0.1 - is-loopback-addr: 2.0.2 - it-pushable: 3.2.3 - it-stream-types: 2.0.1 - netmask: 2.0.2 - p-defer: 4.0.1 - race-event: 1.2.0 - race-signal: 1.0.2 - uint8arraylist: 2.4.8 - transitivePeerDependencies: - - supports-color - dev: false - - /@libp2p/webtransport@4.0.23: - resolution: {integrity: sha512-VkEI0jMPoN/ookywDyrBAul9lb9E/ztbWu+9xQNlrvHgBEaCFplA8dXsWH9tMxFufQ8Zgw/CSWagmLKSsAO+3A==} - dependencies: - '@chainsafe/libp2p-noise': 15.0.0 - '@libp2p/interface': 1.1.6 - '@libp2p/peer-id': 4.0.9 - '@multiformats/multiaddr': 12.2.1 - '@multiformats/multiaddr-matcher': 1.2.0 - it-stream-types: 2.0.1 - multiformats: 13.1.0 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - dev: false - /@multiformats/dns@1.0.6: resolution: {integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==} dependencies: @@ -1060,20 +741,6 @@ packages: progress-events: 1.0.0 uint8arrays: 5.0.3 - /@multiformats/mafmt@12.1.6: - resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==} - dependencies: - '@multiformats/multiaddr': 12.2.1 - dev: false - - /@multiformats/multiaddr-matcher@1.2.0: - resolution: {integrity: sha512-LH6yR7h3HSNKcxuvvi2UpLuowuVkYC6H9Y3jqmKuTai8XtKnXtW6NcDZFD/ooTBY+H4yX/scoJpjOalHrk5qdQ==} - dependencies: - '@chainsafe/is-ip': 2.0.2 - '@multiformats/multiaddr': 12.2.1 - multiformats: 13.1.0 - dev: false - /@multiformats/multiaddr-to-uri@9.0.8: resolution: {integrity: sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==} dependencies: @@ -1104,10 +771,6 @@ packages: uint8-varint: 2.0.4 uint8arrays: 5.0.3 - /@noble/ciphers@0.4.1: - resolution: {integrity: sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==} - dev: false - /@noble/curves@1.4.0: resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} dependencies: @@ -1528,16 +1191,6 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/sinon@17.0.3: - resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} - dependencies: - '@types/sinonjs__fake-timers': 8.1.5 - dev: false - - /@types/sinonjs__fake-timers@8.1.5: - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - dev: false - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.4): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1880,11 +1533,6 @@ packages: resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} dev: false - /any-signal@4.1.1: - resolution: {integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1894,15 +1542,6 @@ packages: engines: {node: '>=8'} dev: true - /asn1js@3.0.5: - resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} - engines: {node: '>=12.0.0'} - dependencies: - pvtsutils: 1.3.5 - pvutils: 1.1.3 - tslib: 2.6.2 - dev: false - /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: @@ -2044,25 +1683,6 @@ packages: multiformats: 11.0.2 dev: false - /datastore-core@9.2.9: - resolution: {integrity: sha512-wraWTPsbtdE7FFaVo3pwPuTB/zXsgwGGAm8BgBYwYAuzZCTS0MfXmd/HH1vR9s0/NFFjOVmBkGiWCvKxZ+QjVw==} - dependencies: - '@libp2p/logger': 4.0.9 - err-code: 3.0.1 - interface-datastore: 8.2.11 - interface-store: 5.1.8 - it-drain: 3.0.5 - it-filter: 3.0.4 - it-map: 3.0.5 - it-merge: 3.0.3 - it-pipe: 3.0.1 - it-pushable: 3.2.3 - it-sort: 3.0.4 - it-take: 3.0.4 - transitivePeerDependencies: - - supports-color - dev: false - /de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true @@ -2082,16 +1702,6 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /delay@6.0.0: - resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} - engines: {node: '>=16'} - dev: false - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2460,10 +2070,6 @@ packages: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} dev: false - /get-iterator@2.0.1: - resolution: {integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==} - dev: false - /get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: @@ -2704,10 +2310,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-loopback-addr@2.0.2: - resolution: {integrity: sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==} - dev: false - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2741,38 +2343,11 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /it-all@3.0.4: - resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} - dev: false - - /it-byte-stream@1.0.8: - resolution: {integrity: sha512-H32LbN6kdX8HXqH68z5uivfkVYJEi5tIPRwIQNR5Qsx3uoDRhYdBRHzf3NOVAf6vqulFUSQLuU+Y0rs/QeWn3A==} - dependencies: - it-stream-types: 2.0.1 - p-defer: 4.0.1 - race-signal: 1.0.2 - uint8arraylist: 2.4.8 - dev: false - - /it-drain@3.0.5: - resolution: {integrity: sha512-qYFe4SWdvs9oJGUY5bSjvmiLUMLzFEODNOQUdYdCIkuIgQF+AUB2INhM4yQ09buJ2rhHKDFxvTD/+yUq6qg0XA==} - dev: false - - /it-filter@3.0.4: - resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} - dependencies: - it-peekable: 3.0.3 - dev: false - /it-first@2.0.1: resolution: {integrity: sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /it-first@3.0.4: - resolution: {integrity: sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==} - dev: false - /it-glob@1.0.2: resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==} dependencies: @@ -2785,95 +2360,21 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /it-length-prefixed-stream@1.1.6: - resolution: {integrity: sha512-MEby4r8n3XIYXjaWT3DweCuhBPQmFVT8RdI1BNjYQ5gelbFD3NLdjYpTI3TVmSEs/aJfgpfVFZzy6iP7OCxIgw==} - dependencies: - it-byte-stream: 1.0.8 - it-stream-types: 2.0.1 - uint8-varint: 2.0.4 - uint8arraylist: 2.4.8 - dev: false - - /it-length-prefixed@9.0.4: - resolution: {integrity: sha512-lz28fykbG0jq7s5XtvlzGxO5BeSOw6ikymkRllxjL21V5VKLcvB4pHr9wPvEnsAJ2et1xpOk3BRTMq9XrhgKsg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - it-reader: 6.0.4 - it-stream-types: 2.0.1 - uint8-varint: 2.0.4 - uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 - dev: false - /it-map@2.0.1: resolution: {integrity: sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /it-map@3.0.5: - resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} - dependencies: - it-peekable: 3.0.3 - dev: false - - /it-merge@3.0.3: - resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} - dependencies: - it-pushable: 3.2.3 - dev: false - - /it-pair@2.0.6: - resolution: {integrity: sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-stream-types: 2.0.1 - p-defer: 4.0.1 - dev: false - - /it-parallel@3.0.6: - resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} - dependencies: - p-defer: 4.0.1 - dev: false - /it-peekable@2.0.1: resolution: {integrity: sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /it-peekable@3.0.3: - resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} - dev: false - - /it-pipe@3.0.1: - resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-merge: 3.0.3 - it-pushable: 3.2.3 - it-stream-types: 2.0.1 - dev: false - /it-pushable@3.2.3: resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} dependencies: p-defer: 4.0.1 - /it-reader@6.0.4: - resolution: {integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-stream-types: 2.0.1 - uint8arraylist: 2.4.8 - dev: false - - /it-sort@3.0.4: - resolution: {integrity: sha512-tvnC93JZZWjX4UxALy0asow0dzXabkoaRbrPJKClTKhNCqw4gzHr+H5axf1gohcthedRRkqd/ae+wl7WqoxFhw==} - dependencies: - it-all: 3.0.4 - dev: false - /it-stream-types@1.0.5: resolution: {integrity: sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -2882,10 +2383,6 @@ packages: resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - /it-take@3.0.4: - resolution: {integrity: sha512-RG8HDjAZlvkzz5Nav4xq6gK5zNT+Ff1UTIf+CrSJW8nIl6N1FpBH5e7clUshiCn+MmmMoSdIEpw4UaTolszxhA==} - dev: false - /it-to-stream@1.0.0: resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} dependencies: @@ -2963,33 +2460,6 @@ packages: type-check: 0.4.0 dev: true - /libp2p@1.3.2: - resolution: {integrity: sha512-5qgiur5P1trzpMQcxlVEk1AIaL4+VnDlLwyWfFENwU3f4hcIvEPGJQdpjQpbdQZyN8H2OjcUxZsUI1tQf4jSjg==} - dependencies: - '@libp2p/crypto': 4.0.5 - '@libp2p/interface': 1.1.6 - '@libp2p/interface-internal': 1.0.11 - '@libp2p/logger': 4.0.9 - '@libp2p/multistream-select': 5.1.6 - '@libp2p/peer-collections': 5.1.9 - '@libp2p/peer-id': 4.0.9 - '@libp2p/peer-id-factory': 4.0.9 - '@libp2p/peer-store': 10.0.13 - '@libp2p/utils': 5.2.8 - '@multiformats/dns': 1.0.6 - '@multiformats/multiaddr': 12.2.1 - any-signal: 4.1.1 - datastore-core: 9.2.9 - interface-datastore: 8.2.11 - it-merge: 3.0.3 - it-parallel: 3.0.6 - merge-options: 3.0.4 - multiformats: 13.1.0 - uint8arrays: 5.0.3 - transitivePeerDependencies: - - supports-color - dev: false - /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3065,14 +2535,6 @@ packages: brace-expansion: 2.0.1 dev: true - /mortice@3.0.4: - resolution: {integrity: sha512-MUHRCAztSl4v/dAmK8vbYi5u1n9NZtQu4H3FsqS7qgMFQIAFw9lTpHiErd9kJpapqmvEdD1L3dUmiikifAvLsQ==} - dependencies: - observable-webworkers: 2.0.1 - p-queue: 8.0.1 - p-timeout: 6.1.2 - dev: false - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3123,11 +2585,6 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: false - /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3170,11 +2627,6 @@ packages: boolbase: 1.0.0 dev: true - /observable-webworkers@2.0.1: - resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true @@ -3487,29 +2939,10 @@ packages: engines: {node: '>=6'} dev: true - /pvtsutils@1.3.5: - resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} - dependencies: - tslib: 2.6.2 - dev: false - - /pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} - dev: false - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /race-event@1.2.0: - resolution: {integrity: sha512-7EvAjTu9uuKa03Jky8yfSy6/SnnMTh6nouNmdeWv9b0dT8eDZC5ylx30cOR9YO9otQorVjjkIuSHQ5Ml/bKwMw==} - dev: false - - /race-signal@1.0.2: - resolution: {integrity: sha512-o3xNv0iTcIDQCXFlF6fPAMEBRjFxssgGoRqLbg06m+AdzEXXLUmoNOoUHTVz2NoBI8hHwKFKoC6IqyNtWr2bww==} - dev: false - /react-native-fetch-api@3.0.0: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} dependencies: @@ -3901,13 +3334,6 @@ packages: webidl-conversions: 3.0.1 dev: false - /wherearewe@2.0.1: - resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - is-electron: 2.2.2 - dev: false - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/src/collector.ts b/src/collector.ts index a2e90f228d20ce57e4224bca2e49e10ac05bfd51..b27beeb6a1e4432f22606189f5f89f6f1e335665 100644 --- a/src/collector.ts +++ b/src/collector.ts @@ -1,11 +1,11 @@ import { decodeAddress, signatureVerify } from '@polkadot/util-crypto' import { u8aToHex } from '@polkadot/util' -import { type Message } from '@libp2p/interface-pubsub' import { CID } from 'multiformats' import { kubo } from './kubo' import { bigintToUint8Array } from './utils' import type { IndexRequest } from './types' -import { addToIndex } from './processor' + +// === payload verification // build payload to sign export function buildBytesPayload(ir: IndexRequest) { @@ -23,46 +23,48 @@ export function isValidSignature(signedMessage: Uint8Array, signature: string, a return signatureVerify(signedMessage, signature, hexPublicKey).isValid } -// === +// === message handling -// message handling function -// TODO allow more control on what to do on messages (filtering, trust list...) -// NOTE: currently unused, more like a template -function handleMessage(message: CustomEvent<Message>) { - const msg = new TextDecoder().decode(message.detail.data) - // const log = `[${message.detail.topic}]: ` + msg - // console.log(log) +// returns a pubsub message handler +// TODO allow more control on what to do from invalid message (instead of simple logging) +// so that it could be used by the app message handler +// TODO allow more control on what to do before processing valid messages (filtering, trust list...) +// this allows to give more details on what is considered valid +export function getPubSubHandler(validMessageHandler: (cid: CID, dag: IndexRequest) => void) { + return (message: any) => { + // decode message as text + const msg = new TextDecoder().decode(message.data).trim() - try { - const cid = CID.parse(msg) - console.log(msg) + try { + const cid = CID.parse(msg) - kubo.dag.get(cid).then(function (d) { - const dag = d.value as IndexRequest - // TODO some validation on dag to ensure it is exact format - // TODO some validation on timestamp to prevent too much control on the key - // example: 0 < Date.now() - timestamp < 1 minute - const bytesPayload = buildBytesPayload(dag) - const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk) - if (isValid) { - // at this point we can apply different treatment based on the key - // we could for example have a trust list published in ipfs - // this is mostly for spam prevention - // but for the moment we will just assume that we trust any key and add the index request to the pool + kubo.dag.get(cid).then(function (d) { + const dag = d.value as IndexRequest + // TODO some validation on dag to ensure it is exact format + // TODO some validation on timestamp to prevent too much control on the key + // example: 0 < Date.now() - timestamp < 1 minute + const bytesPayload = buildBytesPayload(dag) + const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk) + if (isValid) { + // at this point we can apply different treatment based on the key + // we could for example have a trust list published in ipfs + // this is mostly for spam prevention + // but for the moment we will just assume that we trust any key and add the index request to the pool - // we can also apply different treatment based on the key: - // high trust => common timestamp AMT - // low trust => sandboxed HAMT + // we can also apply different treatment based on the key: + // high trust => common timestamp AMT + // low trust => sandboxed HAMT - addToIndex(cid, dag) + validMessageHandler(cid, dag) - // this is all that this indexer does - // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer) - } else { - console.log('[invalid sig] ' + msg) - } - }) - } catch { - console.log('[invalid] ' + msg) + // this is all that this indexer does + // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer) + } else { + console.log('[invalid sig] ' + msg) + } + }) + } catch { + console.log('[invalid] ' + msg) + } } } diff --git a/src/consts.ts b/src/consts.ts index 76b46b5a04322a69aec59ec4911ed49ccd300e8d..0a75bcf0ce5d611d161cf5c2adde828a1302cedd 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -1,5 +1,8 @@ import { CID } from 'multiformats' +// topic used for diffusion of index requests +export const TOPIC = 'ddd' + // base used for index key export const BASE = 16 // current root index diff --git a/src/indexer/start.ts b/src/indexer/start.ts index 1fc959d4f4534d6bef699e6c50572d99dbee7561..412155fc835aafb90fd46e94735c7fcbdbd79660 100644 --- a/src/indexer/start.ts +++ b/src/indexer/start.ts @@ -1,6 +1,6 @@ -import { TOPIC } from '../p2p' +import { TOPIC } from '../consts' import { timestampToKey, mergeInodesSync, arrayToVinode, publishHistory } from '../processor' -import { buildBytesPayload, isValidSignature } from '../collector' +import { getPubSubHandler } from '../collector' import { kubo } from '../kubo' import type { IndexRequest } from '../types' import { CID } from 'multiformats' @@ -11,45 +11,10 @@ import { getRootCIDfromArgs } from './utils' // === HANDLERS === // pubsub message handler -function handleMessage(message: any) { - // console.log('received message') - // console.log(message) - const msg = new TextDecoder().decode(message.data).trim() - - try { - const cid = CID.parse(msg) - // console.log(msg) - - kubo.dag.get(cid).then(function (d) { - const dag = d.value as IndexRequest - // TODO some validation on dag to ensure it is exact format - // TODO some validation on timestamp to prevent too much control on the key - // example: 0 < Date.now() - timestamp < 1 minute - const bytesPayload = buildBytesPayload(dag) - const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk) - if (isValid) { - // at this point we can apply different treatment based on the key - // we could for example have a trust list published in ipfs - // this is mostly for spam prevention - // but for the moment we will just assume that we trust any key and add the index request to the pool - - // we can also apply different treatment based on the key: - // high trust => common timestamp AMT - // low trust => sandboxed HAMT - - processQueue.push([cid, dag]) - events.emit(evtype.trigger) - - // this is all that this indexer does - // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer) - } else { - console.log('[invalid sig] ' + msg) - } - }) - } catch { - console.log('[invalid] ' + msg) - } -} +const handleMessage = getPubSubHandler((cid, dag) => { + processQueue.push([cid, dag]) + events.emit(evtype.trigger) +}) // queue event handler function handleBatch() { diff --git a/src/main.ts b/src/main.ts index f8cbf195e914cbbb3a66e81b67b7c7b79ec5e9ce..b1fed741714f168098636549bae666041ae25304 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,28 +6,21 @@ import router from './router' import { feed } from './global' // collector dependencies -import { local_peer, TOPIC, libp2pForBrowser } from './p2p' -import type { PubSub } from '@libp2p/interface' -import { multiaddr } from '@multiformats/multiaddr' +import { TOPIC } from './consts' import { CID } from 'multiformats' import { kubo } from './kubo' import type { IndexRequest } from './types' import { buildBytesPayload, isValidSignature } from './collector' -import { addToIndex } from './processor' -// start libp2p -// there is no need to do that if we have a kubo node other than demo purpose -const libp2p = await libp2pForBrowser() -await libp2p.start() -await libp2p.dial(local_peer.map(multiaddr)) -const pubsub = libp2p.services.pubsub as PubSub +// activate this for debug purpose if you want to do indexing directly from the browser app +// instead of the nodejs proces +// import { addToIndex } from './processor' // === define what to do of pubsub messages and start listening === // message handler used for demo purpose when in app mode, to display results in the feed -pubsub.addEventListener('message', (message) => { - const msg = new TextDecoder().decode(message.detail.data) - // const log = `[${message.detail.topic}]: ` + msg +function handleMessage(message: any) { + const msg = new TextDecoder().decode(message.data).trim() try { const cid = CID.parse(msg) feed.value.push(msg) @@ -45,9 +38,9 @@ pubsub.addEventListener('message', (message) => { } catch { feed.value.push('[invalid] ' + msg) } -}) +} // subscribe -pubsub.subscribe(TOPIC) +kubo.pubsub.subscribe(TOPIC, handleMessage) // === APP UI === const app = createApp(App) diff --git a/src/p2p.ts b/src/p2p.ts deleted file mode 100644 index 97eacb8009be84a63135f19cd1af66f08856500f..0000000000000000000000000000000000000000 --- a/src/p2p.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createLibp2p } from 'libp2p' -import { bootstrap } from '@libp2p/bootstrap' -import { gossipsub } from '@chainsafe/libp2p-gossipsub' -import { webTransport } from '@libp2p/webtransport' -import type { Libp2p } from '@libp2p/interface' - -export const local_peer = [ - '/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv', - '/ip4/127.0.0.1/udp/4001/quic-v1/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv', - '/ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEiCG3LMdW9dtRC_kXft2TlE66kZ4RX1MzQksLwxRgbJMVw/certhash/uEiC6q4csXlqjvPg_z28SK2fu59NKwOLBDud7j-6Cdn958Q/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv' -] - -export const TOPIC = 'ddd' - -// return libp2p object compatible with browser transport -export function libp2pForBrowser(): Promise<Libp2p> { - return createLibp2p({ - peerDiscovery: [ - bootstrap({ - list: local_peer - }) - ], - transports: [webTransport()], - services: { - pubsub: gossipsub() - }, - connectionGater: { - denyDialMultiaddr: async () => false - } - }) -} diff --git a/src/views/FeedView.vue b/src/views/FeedView.vue index ec72b27b1fb08a87f573ef9722b99664d8293010..4244cf6c761a1a2c7d40aca56a255248d7bdbe56 100644 --- a/src/views/FeedView.vue +++ b/src/views/FeedView.vue @@ -1,40 +1,27 @@ <script setup lang="ts"> import { feed } from '@/global' import { ref, type Ref, onMounted } from 'vue' -import { TOPIC, libp2pForBrowser } from '@/p2p' -import type { PeerId } from '@libp2p/interface' import { CID } from 'multiformats' import FeedRow from '../components/FeedRow.vue' import { kubo } from '../kubo' +import { TOPIC } from '../consts' import type { IndexRequest } from '../types' -import type { PubSub } from '@libp2p/interface' -const subscribers: Ref<PeerId[]> = ref([]) -let pubsub: PubSub | undefined = undefined +const subscribers: Ref<string[]> = ref([]) -function subscribe() { - if (pubsub) pubsub.subscribe(TOPIC) -} -function getSubscribers() { - if (pubsub) subscribers.value = pubsub.getSubscribers(TOPIC) +async function getSubscribers() { + subscribers.value = (await kubo.pubsub.peers(TOPIC)).map((e) => e.toString()) } function get_dag(cid: CID): Promise<IndexRequest> { return kubo.dag.get(cid).then((d) => d.value) } - -function start() { - libp2pForBrowser().then((libp2p) => (pubsub = libp2p.services.pubsub as PubSub)) -} - -onMounted(start) </script> <template> <div> <h1>Feed</h1> <p>Pubsub feed</p> - <p>topic: {{ TOPIC }} <button @click="subscribe">subscribe</button></p> - <p>subscriber list <button @click="getSubscribers">get list</button></p> + <p>topic "{{ TOPIC }}" subscriber list <button @click="getSubscribers">get</button></p> <ul> <li v-for="s in subscribers" :key="s.toString()">{{ s }}</li> </ul>