Skip to content

Commit

Permalink
deps: refresh and update all deps (#410)
Browse files Browse the repository at this point in the history
  • Loading branch information
SgtPooki committed Nov 30, 2023
1 parent 4e96491 commit 67a621c
Show file tree
Hide file tree
Showing 13 changed files with 1,004 additions and 6,977 deletions.
7,743 changes: 885 additions & 6,858 deletions package-lock.json

Large diffs are not rendered by default.

21 changes: 10 additions & 11 deletions package.json
Expand Up @@ -118,26 +118,26 @@
"storybook:build": "storybook build"
},
"dependencies": {
"@chainsafe/libp2p-gossipsub": "^10.1.1",
"@chainsafe/libp2p-noise": "^13.0.5",
"@chainsafe/libp2p-yamux": "^5.0.3",
"@chainsafe/libp2p-noise": "^14.0.0",
"@chainsafe/libp2p-yamux": "^6.0.0",
"@helia/delegated-routing-v1-http-api-client": "^1.1.0",
"@ipld/car": "^5.2.4",
"@ipld/dag-cbor": "^9.0.6",
"@ipld/dag-json": "^10.1.5",
"@ipld/dag-pb": "^4.0.6",
"@libp2p/delegated-content-routing": "^4.0.11",
"@libp2p/delegated-peer-routing": "^4.0.14",
"@libp2p/ipni-content-routing": "^1.0.1",
"@libp2p/autonat": "^1.0.0",
"@libp2p/circuit-relay-v2": "^1.0.0",
"@libp2p/identify": "^1.0.0",
"@libp2p/webrtc": "^4.0.0",
"@libp2p/webtransport": "^4.0.0",
"@loadable/component": "^5.14.1",
"@multiformats/sha3": "^3.0.1",
"cytoscape": "^3.18.1",
"cytoscape-dagre": "^2.3.2",
"filesize": "^6.1.0",
"helia": "^2.1.0",
"ipfs-unixfs": "^11.1.0",
"ipld-git": "^0.6.6",
"ipld-raw": "7.0.0",
"libp2p": "^0.46.21",
"milliseconds": "^1.0.3",
"libp2p": "^1.0.0",
"multiformats": "^12.1.3",
"react-inspector": "^6.0.2",
"react-joyride": "^2.3.0",
Expand Down Expand Up @@ -215,7 +215,6 @@
"i18next-localstorage-backend": "4.1.1",
"interface-datastore": "^8.2.0",
"intl-messageformat": "^10.3.5",
"ipfs-core": "^0.18.0",
"ipfs-css": "^1.4.0",
"jsdom": "^22.1.0",
"npm-run-all": "^4.1.5",
Expand Down
22 changes: 15 additions & 7 deletions src/components/StartExploringPage.jsx
Expand Up @@ -10,8 +10,8 @@ import { projectsTour } from '../lib/tours'

const ExploreSuggestion = ({ cid, name, type }) => (
<a className='flex items-center lh-copy pl3 pl0-l pv3 bb b--black-10 link focus-outline' href={`#/explore/${cid}`}>
<span className='flex items-center justify-center w3 h3 flex-none br-100 tc' style={{ background: colorForNode(type) }}>
<span className='montserrat fw2 f4 snow' title={nameForNode(type)}>{shortNameForNode(type)}</span>
<span className='flex items-center justify-center w3 h3 w3-m h3-m w3-l h3-l flex-none br-100 tc' style={{ background: colorForNode(type) }}>
<span className='montserrat fw3 f6 snow' title={nameForNode(type)}>{shortNameForNode(type)}</span>
</span>
<span className='pl3 truncate'>
<h2 className='ma0 fw4 f5 db black montserrat'>{name}</h2>
Expand Down Expand Up @@ -43,22 +43,30 @@ const StartExploringPage = ({ t, embed, runTour = false, joyrideCallback }) => (
<ExploreSuggestion name='HAMT-sharded Wikipedia mirror (>20M files)' cid='bafybeiaysi4s6lnjev27ln5icwm6tueaw2vdykrtjkwiphwekaywqhcjze' type='hamt-sharded-directory' />
</li>
<li>
<ExploreSuggestion name='B-tree search index from ipfs-geoip' cid='bafyreihnpl7ami7esahkfdnemm6idx4r2n6u3apmtcrxlqwuapgjsciihy' type='dag-cbor' />
<ExploreSuggestion name='B-tree search index from ipfs-geoip' cid='bafyreif3tfdpr5n4jdrbielmcapwvbpcthepfkwq2vwonmlhirbjmotedi' type='dag-cbor' />
</li>
<li>
<ExploreSuggestion name='DAG-CBOR Block' cid='bafyreicnokmhmrnlp2wjhyk2haep4tqxiptwfrp2rrs7rzq7uk766chqvq' type='dag-cbor' />
</li>
<li>
<ExploreSuggestion name='Raw Block for "hello"' cid='bafkreibm6jg3ux5qumhcn2b3flc3tyu6dmlb4xa7u5bf44yegnrjhc4yeq' type='raw' />
<ExploreSuggestion name='dag-cbor hello world (keccak-256)' cid='bafyrwigbexamue2ba3hmtai7hwlcmd6ekiqsduyf5avv7oz6ln3radvjde' type='dag-cbor' />
</li>
<li>
{/*
From https://cerscan.com/mainnet/stream/kjzl6cwe1jw148sn9t1pkwlwr28a93bfd5mvxxnif4u8x2jomlpqqukwk940u5v
For https://snapshot.org/#/sgbchat.eth/proposal/0x75506089eb396c42e833a49a75faebddeede0fa94c7d894741e0a31cae58dbfd
see https://developers.ceramic.network/reference/typescript/interfaces/_ceramicnetwork_common.LogEntry.html for more information
*/}
<ExploreSuggestion name='Ceramic LogEntry for sgb.chat Ambassador proposal' cid='bagcqcerarvdwmhvk73mze3e2n6yvpt5h7fh3eae7n6y3hizsflz5grpyeczq' type='dag-jose' />
</li>
<li>
<ExploreSuggestion name='dag-json hello world' cid='baguqeerasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea' type='dag-json' />
<ExploreSuggestion name='hello world' cid='baguqeerasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea' type='dag-json' />
</li>
<li>
<ExploreSuggestion name='dag-jose' cid='bagcqceraxvt5izt4sz7kjfrm42dxrutp6ijywgsacllkznzekmfojypkvfea' type='dag-jose' />
<ExploreSuggestion name='hello world (sha3-512)' cid='bagaaifcavabu6fzheerrmtxbbwv7jjhc3kaldmm7lbnvfopyrthcvod4m6ygpj3unrcggkzhvcwv5wnhc5ufkgzlsji7agnmofovc2g4a3ui7ja' type='json' />
</li>
<li>
<ExploreSuggestion name='IGIS Git Repo' cid='baf4bcfg4ep767tjp5lxyanx5urpjjgx5q2volvy' type='git-raw' />
<ExploreSuggestion name='Raw Block for "hello"' cid='bafkreibm6jg3ux5qumhcn2b3flc3tyu6dmlb4xa7u5bf44yegnrjhc4yeq' type='raw' />
</li>
</ul>
</div>
Expand Down
4 changes: 2 additions & 2 deletions src/components/cid-info/decode-cid.js
@@ -1,12 +1,12 @@
import { CID } from 'multiformats'

import baseImporter from '../../lib/base-importer'
import hashImporter from '../../lib/hash-importer'
import { getHasherForCode } from '../../lib/hash-importer'

export async function decodeCid (value) {
const cid = CID.parse(value)
try {
const multihasher = await hashImporter(cid.multihash.code)
const multihasher = await getHasherForCode(cid.multihash.code)
const multibase = await baseImporter(value.substring(0, 1))
const multicodec = {
name: cid.code
Expand Down
17 changes: 8 additions & 9 deletions src/components/object-info/ObjectInfo.jsx
Expand Up @@ -23,18 +23,17 @@ const objectInspectorTheme = {
// Use https://github.com/multiformats/multicodec/blob/master/table.csv to get full name.
const nodeStyles = {
// most-common
'dag-cbor': { shortName: 'CBOR', name: 'dag-cbor', color: theme.colors.aqua },
'dag-json': { shortName: 'JSON', name: 'dag-json', color: theme.colors.green },
'dag-cbor': { shortName: 'DAG-CBOR', name: 'dag-cbor', color: theme.colors.aqua },
'dag-json': { shortName: 'DAG-JSON', name: 'dag-json', color: theme.colors.green },
raw: { shortName: 'RAW', name: 'Raw Block', color: theme.colors.red }, // red because it's special
'dag-pb': { shortName: 'PB', name: 'dag-pb', color: theme.colors.teal },
'dag-pb': { shortName: 'DAG-PB', name: 'dag-pb', color: theme.colors.teal },

// exciting
'dag-jose': { shortName: 'DAG-JOSE', name: 'dag-jose', color: theme.colors.yellow },

// less common
json: { shortName: 'JSON', name: 'JSON', color: theme.colors['green-muted'] },
'hamt-sharded-directory': { shortName: 'PB+H', name: 'HAMT-Sharded dag-pb Directory', color: theme.colors['teal-muted'] },

// infrequent
'dag-jose': { shortName: 'JOSE', name: 'dag-jose', color: theme.colors.yellow },
'git-raw': { shortName: 'GIT', name: 'Git', color: theme.colors['yellow-muted'] },
'hamt-sharded-directory': { shortName: 'HAMT\nDAG-PB', name: 'HAMT-Sharded dag-pb Directory', color: theme.colors['teal-muted'] },

// rare
'eth-block': { shortName: 'ETH', name: 'Ethereum Block', color: theme.colors.charcoal },
Expand Down Expand Up @@ -181,7 +180,7 @@ const ObjectInfo = ({ t, tReady, className, type, cid, localPath, size, data, li
{!data
? null
: (
<div className='pa3 mt2 bg-white f5 nl3 nr3 mh0-l'>
<div className='pa3 mt2 bg-white f5 nl3 nr3 mh0-l overflow-x-auto'>
<ObjectInspector showMaxKeys={100} data={getObjectInspectorData(data)} theme={objectInspectorTheme} expandPaths={toExpandPathsNotation(localPath)} />
</div>
)}
Expand Down
22 changes: 0 additions & 22 deletions src/global.d.ts
Expand Up @@ -8,25 +8,3 @@ declare module 'stream-to-it' {
const toIterable: toIterable
export default toIterable
}

interface OldIpldFormat {
util: {
serialize(obj: unknown): Promise<Uint8Array>
deserialize(bytes: Uint8Array): Promise<unknown>

codec: number
defaultHashAlg: number
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
cid: import('multiformats').CID
}
codec: number
resolver: {
resolve(bytes: Uint8Array, path: string): Promise<unknown>
tree(bytes: Uint8Array): Promise<unknown>
}
defaultHashAlg: number
}
declare module 'ipld-git' {
const defaultExport: OldIpldFormat
export default defaultExport
}
2 changes: 1 addition & 1 deletion src/lib/cid.js
@@ -1,7 +1,7 @@
import * as dagCbor from '@ipld/dag-cbor'
import * as dagJson from '@ipld/dag-json'
import * as dagPb from '@ipld/dag-pb'
import { CID } from 'multiformats'
import { CID } from 'multiformats/cid'

/**
* @template {string} Prefix
Expand Down
23 changes: 12 additions & 11 deletions src/lib/codec-importer.ts
Expand Up @@ -4,32 +4,33 @@ import { type BlockCodec } from 'multiformats/codecs/interface'
import getCodecNameFromCode from './get-codec-name-from-code'

type CodecDataTypes = PBNode | Uint8Array
interface CodecImporterResponse<T> extends Pick<BlockCodec<number, T | unknown>, 'decode'> {
interface CodecImporterResponse<T> extends Pick<BlockCodec<number, T | unknown>, 'decode' | 'encode' | 'code'> {
}

export default async function codecImporter<T extends CodecDataTypes = CodecDataTypes> (codecCode: number): Promise<CodecImporterResponse<T>> {
const codecName = getCodecNameFromCode(codecCode)
export default async function codecImporter<T extends CodecDataTypes = CodecDataTypes> (codeOrName: number | string): Promise<CodecImporterResponse<T>> {
let codecName: string
if (typeof codeOrName === 'string') {
codecName = codeOrName
} else {
codecName = getCodecNameFromCode(codeOrName)
}

switch (codecName) {
case 'dag-cbor':
return import('@ipld/dag-cbor')
case 'dag-pb':
return import('@ipld/dag-pb')
case 'git-raw':
return {
decode: (await import('ipld-git')).default.util.deserialize
}
throw new Error('git-raw is unsupported until https://github.com/ipld/js-ipld-git is updated.')
case 'raw':
return import('multiformats/codecs/raw')
case 'json':
return import('multiformats/codecs/json')
case 'dag-json':
return import('@ipld/dag-json')
case 'dag-jose':
return {
decode: (await import('dag-jose')).decode as unknown as
((bytes: Uint8Array) => Promise<unknown>)
}
return import('dag-jose')
default:
throw new Error(`unsupported codec: ${codecCode}=${getCodecNameFromCode(codecCode)}`)
throw new Error(`unsupported codec: ${codeOrName}=${codecName}`)
}
}
22 changes: 11 additions & 11 deletions src/lib/get-codec-name-from-code.ts
@@ -1,23 +1,23 @@
import multicodecs from 'multicodec'

/**
* Converts supported codec codes from https://github.com/multiformats/multicodec/blob/master/table.csv to their names.
*/
export default function getCodecNameFromCode (code: number): string {
switch (code) {
case multicodecs.DAG_CBOR:
case 113:
return 'dag-cbor'
case multicodecs.DAG_PB:
case 112:
return 'dag-pb'
case multicodecs.GIT_RAW:
case 120:
return 'git-raw'
case multicodecs.RAW:
case 85:
return 'raw'
case multicodecs.JSON:
case 512:
return 'json'
case multicodecs.DAG_JSON:
case 297:
return 'dag-json'
case multicodecs.DAG_JOSE:
case 133:
return 'dag-jose'
default:
// TODO: Remove dependency on multicodecs
return multicodecs.codeToName[code as multicodecs.CodecCode]
return `codec code ${code}=unknown`
}
}
44 changes: 28 additions & 16 deletions src/lib/hash-importer.ts
@@ -1,39 +1,51 @@
/* global globalThis */
import { keccak256 } from 'js-sha3'
import * as sha3 from '@multiformats/sha3'
import { type Hasher, from } from 'multiformats/hashes/hasher'
import * as sha2 from 'multiformats/hashes/sha2'

type SupportedHashers = typeof sha2.sha256 | typeof sha2.sha512 | Hasher<'keccak-256', 27> | Hasher<'sha1', 17>
export type SupportedHashers = typeof sha2.sha256 |
typeof sha2.sha512 |
Hasher<'keccak-256', 27> |
Hasher<'sha1', 17> |
Hasher<'blake2b-512', 45632> |
Hasher<'sha3-512', 20>

export async function getHashersForCodes (...codes: number[]): Promise<SupportedHashers[]> {
export async function getHashersForCodes (code: number, ...codes: number[]): Promise<SupportedHashers[]> {
return Promise.all(codes.map(getHasherForCode))
}

export default async function getHasherForCode (code: number): Promise<SupportedHashers> {
/**
* Helper function to prevent `this` from being lost when calling `encode` and `digest` on a hasher.
*/
function getBoundHasher <T extends SupportedHashers> (hasher: T): T {
return {
...hasher,
encode: hasher.encode.bind(hasher),
digest: hasher.digest.bind(hasher)
}
}

export async function getHasherForCode (code: number): Promise<SupportedHashers> {
switch (code) {
case sha2.sha256.code:
return sha2.sha256
return getBoundHasher(sha2.sha256)
case sha2.sha512.code:
return sha2.sha512
return getBoundHasher(sha2.sha512)
case 17:
// git hasher uses sha1. see ipld-git/src/util.js
return from({
return getBoundHasher(from({
name: 'sha1',
code,
encode: async (data: Uint8Array) => {
const crypto = globalThis.crypto ?? (await import('crypto')).webcrypto
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
return new Uint8Array(hashBuffer)
}
})
case 27: // keccak-256
return from({
name: 'keccak-256',
code,
encode: async (data: Uint8Array) => {
return new Uint8Array(keccak256.arrayBuffer(data))
}
})
}))
case sha3.sha3512.code: // sha3-512
return getBoundHasher(sha3.sha3512)
case sha3.keccak256.code: // keccak-256
return getBoundHasher(sha3.keccak256)

default:
throw new Error(`unknown multihasher code '${code}'`)
Expand Down
18 changes: 9 additions & 9 deletions src/lib/helpers.ts
@@ -1,20 +1,20 @@
import { type Helia } from '@helia/interface'
import { CID, type MultihashDigest } from 'multiformats'
import { sha256 } from 'multiformats/hashes/sha2'
import { CID } from 'multiformats'

import codecImporter from './codec-importer.js'
import { getHasherForCode } from './hash-importer.js'

export function ensureLeadingSlash (str: string): string {
if (str.startsWith('/')) return str
return `/${str}`
}

export interface DigestFn {
(data: Uint8Array): Promise<MultihashDigest<number>>
}

export async function addDagNodeToHelia <T> (helia: Helia, codec: { encode(n: T): Uint8Array, code: number }, node: T, digestFn?: DigestFn): Promise<CID> {
export async function addDagNodeToHelia <T> (helia: Helia, codecName: string, node: T, hasherCode = 18): Promise<CID> {
const codec = await codecImporter(codecName)
const hasher = await getHasherForCode(hasherCode)
const encodedNode = codec.encode(node)
const hash = digestFn != null ? await digestFn(encodedNode) : await sha256.digest(encodedNode)
const cid = CID.createV1(codec.code, hash)
const mhDigest = await hasher.digest(encodedNode)
const cid = CID.createV1(codec.code, mhDigest)

return helia.blockstore.put(cid, encodedNode)
}

0 comments on commit 67a621c

Please sign in to comment.