diff --git a/packages/w3ui/.github/workflows/w3console.yaml b/packages/w3ui/.github/workflows/w3console.yaml index 1965476a1..50eb2460d 100644 --- a/packages/w3ui/.github/workflows/w3console.yaml +++ b/packages/w3ui/.github/workflows/w3console.yaml @@ -23,6 +23,11 @@ jobs: - name: Build w3console run: pnpm build working-directory: examples/react/w3console + env: + VITE_W3UP_ACCESS_SERVICE_URL: 'https://w3access-staging.protocol-labs.workers.dev' + VITE_W3UP_ACCESS_SERVICE_DID: 'did:web:staging.web3.storage' + VITE_W3UP_UPLOAD_SERVICE_URL: 'https://staging.up.web3.storage' + VITE_W3UP_UPLOAD_SERVICE_DID: 'did:web:staging.web3.storage' - name: Publish static site uses: ./.github/actions/preview diff --git a/packages/w3ui/examples/react/playground/package.json b/packages/w3ui/examples/react/playground/package.json index e215ceeed..22dadbf97 100644 --- a/packages/w3ui/examples/react/playground/package.json +++ b/packages/w3ui/examples/react/playground/package.json @@ -32,7 +32,7 @@ "@storybook/testing-library": "^0.0.13", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", - "@ucanto/interface": "^4.2.3", + "@ucanto/interface": "^6.2.0", "@vitejs/plugin-react": "^3.0.0", "@w3ui/uploads-list-core": "workspace:^", "multiformats": "^11.0.1", diff --git a/packages/w3ui/examples/react/w3console/package.json b/packages/w3ui/examples/react/w3console/package.json index 1d3c54180..d0dfcfdc7 100644 --- a/packages/w3ui/examples/react/w3console/package.json +++ b/packages/w3ui/examples/react/w3console/package.json @@ -25,8 +25,8 @@ "devDependencies": { "@preact/preset-vite": "^2.4.0", "@types/blueimp-md5": "^2.18.0", - "@ucanto/core": "^4.1.0", - "@ucanto/interface": "^4.1.0", + "@ucanto/core": "^5.2.0", + "@ucanto/interface": "^6.2.0", "autoprefixer": "^10.4.13", "postcss": "^8.4.21", "tailwindcss": "^3.2.4", diff --git a/packages/w3ui/examples/react/w3console/src/app.tsx b/packages/w3ui/examples/react/w3console/src/app.tsx index 0c456b7d2..933afc650 100644 --- a/packages/w3ui/examples/react/w3console/src/app.tsx +++ b/packages/w3ui/examples/react/w3console/src/app.tsx @@ -13,7 +13,7 @@ import { Uploader } from './components/Uploader' import { UploadsList } from './components/UploadsList' import { W3APIProvider } from './components/W3API' import { SpaceFinder } from './components/SpaceFinder' -import { SpaceCreator } from './components/SpaceCreator' +import { SpaceCreatorForm, SpaceCreator } from './components/SpaceCreator' function SpaceRegistrar (): JSX.Element { const [, { registerSpace }] = useKeyring() @@ -140,7 +140,12 @@ function SpaceSection (props: SpaceSectionProps): JSX.Element { )} - {!registered && !share && } + {(space && !registered) && !share && } + {!space && ( +
+

Select a space from the dropdown on the left to get started.

+
+ )} ) @@ -187,7 +192,33 @@ export function Logo (): JSX.Element { ) } -export function Layout (): JsxElement { +export function SpaceEnsurer ({ + children +}: { + children: JSX.Element | JSX.Element[] +}): JSX.Element { + const [{ spaces, account }] = useKeyring() + if (spaces && spaces.length > 0) { + return <>{children} + } + return ( +
+
+

Welcome {account}!

+

+ To get started with w3up you'll need to create a space. +

+

+ Give it a name and hit create! +

+ +
+
+ ) +} + + +export function Layout (): JSX.Element { const [share, setShare] = useState(false) const [{ space, spaces }, { setCurrentSpace }] = useKeyring() @@ -224,7 +255,9 @@ export function App (): JSX.Element { return ( - + + + ) diff --git a/packages/w3ui/examples/react/w3console/src/components/Authenticator.tsx b/packages/w3ui/examples/react/w3console/src/components/Authenticator.tsx index a5499fb67..94b23f01c 100644 --- a/packages/w3ui/examples/react/w3console/src/components/Authenticator.tsx +++ b/packages/w3ui/examples/react/w3console/src/components/Authenticator.tsx @@ -49,9 +49,9 @@ export function AuthenticationEnsurer ({ }: { children: JSX.Element | JSX.Element[] }): JSX.Element { - const [{ spaces, submitted }] = useAuthenticator() - const registered = Boolean(spaces.some((s) => s.registered())) - if (registered) { + const [{ submitted, account }] = useAuthenticator() + const authenticated = !!account + if (authenticated) { return <>{children} } if (submitted) { diff --git a/packages/w3ui/examples/react/w3console/src/components/SpaceCreator.tsx b/packages/w3ui/examples/react/w3console/src/components/SpaceCreator.tsx index de2e1c0b7..1911b03b8 100644 --- a/packages/w3ui/examples/react/w3console/src/components/SpaceCreator.tsx +++ b/packages/w3ui/examples/react/w3console/src/components/SpaceCreator.tsx @@ -13,83 +13,92 @@ export function SpaceCreatorCreating (): JSX.Element { ) } -interface SpaceCreatorProps { +interface SpaceCreatorFormProps { className?: string } -export function SpaceCreator ({ +export function SpaceCreatorForm ({ className = '' -}: SpaceCreatorProps): JSX.Element { - const [, { createSpace, registerSpace }] = useKeyring() - const [creating, setCreating] = useState(false) +}: SpaceCreatorFormProps): JSX.Element { + const [{ account }, { createSpace, registerSpace }] = useKeyring() const [submitted, setSubmitted] = useState(false) - const [email, setEmail] = useState('') const [name, setName] = useState('') function resetForm (): void { - setEmail('') setName('') } async function onSubmit (e: React.FormEvent): Promise { e.preventDefault() - setSubmitted(true) - try { - await createSpace(name) - // ignore this because the Space UI should handle helping the user recover - // from space registration failure - void registerSpace(email) - } catch (error) { - /* eslint-disable no-console */ - console.error(error) - /* eslint-enable no-console */ - throw new Error('failed to register', { cause: error }) - } finally { - resetForm() - setSubmitted(false) + if (account) { + setSubmitted(true) + try { + await createSpace(name) + // ignore this because the Space UI should handle helping the user recover + // from space registration failure + await registerSpace(account) + } catch (error) { + /* eslint-disable no-console */ + console.error(error) + /* eslint-enable no-console */ + throw new Error('failed to register', { cause: error }) + } finally { + resetForm() + setSubmitted(false) + } + } else { + throw new Error('cannot create space, no account found, have you authorized your email?') } } - /* eslint-disable no-nested-ternary */ + return ( +
+ { + submitted + ? ( + + ) + : ( +
) => { + void onSubmit(e) + }} + > + ) => { + setName(e.target.value) + }} + /> + +
+ ) + } +
+ ) +} + +interface SpaceCreatorProps { + className?: string +} + +export function SpaceCreator ({ + className = '' +}: SpaceCreatorProps): JSX.Element { + const [creating, setCreating] = useState(false) + return (
{creating ? ( - submitted - ? ( - - ) - : ( -
) => { - void onSubmit(e) - }} - > - ) => { - setEmail(e.target.value) - }} - /> - ) => { - setName(e.target.value) - }} - /> - -
- ) - ) + + ) : ( - )} + )}
) /* eslint-enable no-nested-ternary */ diff --git a/packages/w3ui/examples/react/w3console/src/components/SpaceFinder.tsx b/packages/w3ui/examples/react/w3console/src/components/SpaceFinder.tsx index ccea6b1eb..ee4c81e51 100644 --- a/packages/w3ui/examples/react/w3console/src/components/SpaceFinder.tsx +++ b/packages/w3ui/examples/react/w3console/src/components/SpaceFinder.tsx @@ -33,7 +33,7 @@ export function SpaceFinder ({ a.sameAs(b)} + by={(a, b) => a?.sameAs(b)} >
@@ -57,7 +57,7 @@ export function SpaceFinder ({ afterLeave={() => { setQuery('') }} > {filtered.length === 0 && query !== '' diff --git a/packages/w3ui/examples/react/w3console/src/components/W3API.tsx b/packages/w3ui/examples/react/w3console/src/components/W3API.tsx index b621dd707..ae3ece772 100644 --- a/packages/w3ui/examples/react/w3console/src/components/W3API.tsx +++ b/packages/w3ui/examples/react/w3console/src/components/W3API.tsx @@ -15,6 +15,7 @@ import { KeyringContextValue, KeyringProvider } from '@w3ui/react-keyring' +import { accessServiceConnection, accessServicePrincipal, uploadServiceConnection, uploadServicePrincipal } from './services' export interface W3APIContextValue { keyring: KeyringContextValue @@ -35,9 +36,9 @@ export function W3APIProvider ({ uploadsListPageSize }: W3APIProviderProps): JSX.Element { return ( - - - + + + <>{children} diff --git a/packages/w3ui/examples/react/w3console/src/components/services.ts b/packages/w3ui/examples/react/w3console/src/components/services.ts new file mode 100644 index 000000000..e77811042 --- /dev/null +++ b/packages/w3ui/examples/react/w3console/src/components/services.ts @@ -0,0 +1,43 @@ +import type { Service } from '@web3-storage/access/types' +import { connect } from '@ucanto/client' +import { CAR, CBOR, HTTP } from '@ucanto/transport' +import * as DID from '@ipld/dag-ucan/did' + + +export const accessServiceURL = new URL( + //'https://w3access-staging.protocol-labs.workers.dev' + import.meta.env.VITE_W3UP_ACCESS_SERVICE_URL +) +export const accessServicePrincipal = DID.parse( + //'did:web:staging.web3.storage' + import.meta.env.VITE_W3UP_ACCESS_SERVICE_DID +) + +export const accessServiceConnection = connect({ + id: accessServicePrincipal, + encoder: CAR, + decoder: CBOR, + channel: HTTP.open>({ + url: accessServiceURL, + method: 'POST', + }), +}) + +export const uploadServiceURL = new URL( + //'https://staging.up.web3.storage' + import.meta.env.VITE_W3UP_UPLOAD_SERVICE_URL +) +export const uploadServicePrincipal = DID.parse( + //'did:web:staging.web3.storage' + import.meta.env.VITE_W3UP_UPLOAD_SERVICE_DID +) + +export const uploadServiceConnection = connect({ + id: uploadServicePrincipal, + encoder: CAR, + decoder: CBOR, + channel: HTTP.open>({ + url: uploadServiceURL, + method: 'POST', + }), +}) diff --git a/packages/w3ui/package.json b/packages/w3ui/package.json index 5870ab53b..c9899ff56 100644 --- a/packages/w3ui/package.json +++ b/packages/w3ui/package.json @@ -40,11 +40,11 @@ "@types/jest": "^29.4.0", "@types/jsdom": "^20.0.1", "@types/react": "^18.0.26", - "@ucanto/client": "^4.2.3", - "@ucanto/server": "^4.2.3", - "@ucanto/transport": "^4.2.3", + "@ucanto/client": "^5.1.0", + "@ucanto/server": "^6.1.0", + "@ucanto/transport": "^5.1.1", "@web-std/file": "^3.0.2", - "@web3-storage/capabilities": "^2.2.0", + "@web3-storage/capabilities": "^4.0.0", "esm": "^3.2.25", "fake-indexeddb": "^4.0.1", "hd-scripts": "^4.1.0", diff --git a/packages/w3ui/packages/keyring-core/package.json b/packages/w3ui/packages/keyring-core/package.json index 35f229336..cd23deff6 100644 --- a/packages/w3ui/packages/keyring-core/package.json +++ b/packages/w3ui/packages/keyring-core/package.json @@ -31,9 +31,9 @@ }, "homepage": "https://github.com/web3-storage/w3ui/tree/main/packages/keyring-core", "dependencies": { - "@ucanto/interface": "^4.2.3", - "@ucanto/principal": "^4.2.3", - "@web3-storage/access": "^9.4.0" + "@ucanto/interface": "^6.2.0", + "@ucanto/principal": "^5.1.0", + "@web3-storage/access": "11.0.0-rc.0" }, "eslintConfig": { "extends": [ diff --git a/packages/w3ui/packages/keyring-core/src/index.ts b/packages/w3ui/packages/keyring-core/src/index.ts index ba33db3e9..806543f78 100644 --- a/packages/w3ui/packages/keyring-core/src/index.ts +++ b/packages/w3ui/packages/keyring-core/src/index.ts @@ -87,6 +87,10 @@ export interface KeyringContextState { * The current user agent (this device). */ agent?: Signer + /** + * The account this device is authorized to act as. Currently just an email address. + */ + account?: string } export interface KeyringContextActions { @@ -104,6 +108,10 @@ export interface KeyringContextActions { * storage. Note: this removes all data and is unrecoverable. */ resetAgent: () => Promise + /** + * Authorize this device to act as the account linked to email. + */ + authorize: (email: '{string}@{string}') => Promise /** * Create a new space with the passed name and set it as the current space. */ diff --git a/packages/w3ui/packages/react-keyring/package.json b/packages/w3ui/packages/react-keyring/package.json index 33090a56c..7a0f40a95 100644 --- a/packages/w3ui/packages/react-keyring/package.json +++ b/packages/w3ui/packages/react-keyring/package.json @@ -31,14 +31,15 @@ "homepage": "https://github.com/web3-storage/w3ui/tree/main/packages/react-keyring", "dependencies": { "@w3ui/keyring-core": "workspace:^", - "ariakit-react-utils": "0.17.0-next.27" + "ariakit-react-utils": "0.17.0-next.27", + "use-local-storage-state": "^18.2.1" }, "devDependencies": { "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", - "@ucanto/interface": "^4.2.3", - "@ucanto/principal": "^4.2.3", - "@web3-storage/access": "^9.4.0" + "@ucanto/interface": "^6.2.0", + "@ucanto/principal": "^5.1.0", + "@web3-storage/access": "11.0.0-rc.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" diff --git a/packages/w3ui/packages/react-keyring/src/Authenticator.tsx b/packages/w3ui/packages/react-keyring/src/Authenticator.tsx index fcad710e9..4a9151dc7 100644 --- a/packages/w3ui/packages/react-keyring/src/Authenticator.tsx +++ b/packages/w3ui/packages/react-keyring/src/Authenticator.tsx @@ -67,7 +67,8 @@ export const AuthenticatorContext = createContext([ createDelegation: async () => { throw new Error('missing keyring context provider') }, - addSpace: async () => {} + addSpace: async () => {}, + authorize: async () => {} } ]) @@ -100,7 +101,7 @@ AuthenticatorRootOptions export const AuthenticatorRoot: Component = createComponent((props) => { const [state, actions] = useKeyring() - const { createSpace, registerSpace } = actions + const { authorize } = actions const [email, setEmail] = useState('') const [submitted, setSubmitted] = useState(false) @@ -109,15 +110,16 @@ export const AuthenticatorRoot: Component = e.preventDefault() setSubmitted(true) try { - await createSpace() - await registerSpace(email) + await authorize(email as '{string}@{string}') } catch (error: any) { + // eslint-disable-next-line no-console + console.error('failed to register:', error) throw new Error('failed to register', { cause: error }) } finally { setSubmitted(false) } }, - [email, setSubmitted, createSpace, registerSpace] + [email, setSubmitted, authorize] ) const value = useMemo( diff --git a/packages/w3ui/packages/react-keyring/src/providers/Keyring.tsx b/packages/w3ui/packages/react-keyring/src/providers/Keyring.tsx index 80e8bfd4f..e258b5b4b 100644 --- a/packages/w3ui/packages/react-keyring/src/providers/Keyring.tsx +++ b/packages/w3ui/packages/react-keyring/src/providers/Keyring.tsx @@ -1,8 +1,9 @@ import React, { createContext, useState, useContext } from 'react' +import useLocalStorageState from 'use-local-storage-state' import { createAgent, Space, - getCurrentSpace, + getCurrentSpace as getCurrentSpaceInAgent, getSpaces, CreateDelegationOptions } from '@w3ui/keyring-core' @@ -13,6 +14,7 @@ import type { } from '@w3ui/keyring-core' import type { Agent } from '@web3-storage/access' import type { Abilities } from '@web3-storage/access/types' +import { authorizeWithSocket } from '@web3-storage/access/agent' import type { Capability, Delegation, @@ -33,12 +35,14 @@ export const keyringContextDefaultValue: KeyringContextValue = [ { space: undefined, spaces: [], - agent: undefined + agent: undefined, + account: undefined }, { loadAgent: async () => {}, unloadAgent: async () => {}, resetAgent: async () => {}, + authorize: async () => {}, createSpace: async () => { throw new Error('missing keyring context provider') }, @@ -70,6 +74,7 @@ export function KeyringProvider ({ connection }: KeyringProviderProps): JSX.Element { const [agent, setAgent] = useState() + const [account, setAccount] = useLocalStorageState('w3ui-account-email') const [space, setSpace] = useState() const [spaces, setSpaces] = useState([]) const [issuer, setIssuer] = useState() @@ -81,13 +86,35 @@ export function KeyringProvider ({ const a = await createAgent({ servicePrincipal, connection }) setAgent(a) setIssuer(a.issuer) - setSpace(getCurrentSpace(a)) + setSpace(getCurrentSpaceInAgent(a)) setSpaces(getSpaces(a)) return a } return agent } + const authorize = async (email: '{string}@{string}'): Promise => { + const agent = await getAgent() + const controller = new AbortController() + setRegisterAbortController(controller) + + try { + await authorizeWithSocket(agent, email, { signal: controller.signal }) + // TODO is there other state that needs to be initialized? + setAccount(email) + const newSpaces = getSpaces(agent) + setSpaces(newSpaces) + const newCurrentSpace = getCurrentSpaceInAgent(agent) ?? newSpaces[0] + if (newCurrentSpace != null) { + await setCurrentSpace(newCurrentSpace.did() as DID<'key'>) + } + } catch (error) { + if (!controller.signal.aborted) { + throw error + } + } + } + const cancelRegisterSpace = (): void => { if (registerAbortController != null) { registerAbortController.abort() @@ -98,7 +125,7 @@ export function KeyringProvider ({ const agent = await getAgent() const { did } = await agent.createSpace(name) await agent.setCurrentSpace(did) - setSpace(getCurrentSpace(agent)) + setSpace(getCurrentSpaceInAgent(agent)) return did } @@ -108,8 +135,11 @@ export function KeyringProvider ({ setRegisterAbortController(controller) try { - await agent.registerSpace(email, { signal: controller.signal }) - setSpace(getCurrentSpace(agent)) + await agent.registerSpace(email, { + signal: controller.signal, + provider: agent.connection.id.did() as DID<'web'> + }) + setSpace(getCurrentSpaceInAgent(agent)) setSpaces(getSpaces(agent)) } catch (error) { if (!controller.signal.aborted) { @@ -120,8 +150,8 @@ export function KeyringProvider ({ const setCurrentSpace = async (did: DID): Promise => { const agent = await getAgent() - await agent.setCurrentSpace(did) - setSpace(getCurrentSpace(agent)) + await agent.setCurrentSpace(did as DID<'key'>) + setSpace(getCurrentSpaceInAgent(agent)) } const loadAgent = async (): Promise => { @@ -173,9 +203,11 @@ export function KeyringProvider ({ const state = { space, spaces, - agent: issuer + agent: issuer, + account } const actions = { + authorize, loadAgent, unloadAgent, resetAgent, diff --git a/packages/w3ui/packages/react-keyring/test/Authenticator.spec.tsx b/packages/w3ui/packages/react-keyring/test/Authenticator.spec.tsx index edd8ea53d..e16e40222 100644 --- a/packages/w3ui/packages/react-keyring/test/Authenticator.spec.tsx +++ b/packages/w3ui/packages/react-keyring/test/Authenticator.spec.tsx @@ -32,15 +32,13 @@ test('CancelButton', async () => { }) test('Form', async () => { - const createSpace = vi.fn() - const registerSpace = vi.fn() + const authorize = vi.fn() const contextValue: KeyringContextValue = [ keyringContextDefaultValue[0], { ...keyringContextDefaultValue[1], - createSpace, - registerSpace + authorize } ] render( @@ -62,6 +60,5 @@ test('Form', async () => { const submitButton = screen.getByText('Create Space') await user.click(submitButton) - expect(createSpace).toHaveBeenCalledOnce() - expect(registerSpace).toHaveBeenCalledWith(myEmail) + expect(authorize).toHaveBeenCalledOnce() }) diff --git a/packages/w3ui/packages/react-uploader/package.json b/packages/w3ui/packages/react-uploader/package.json index d05e09f3f..b8278bbc8 100644 --- a/packages/w3ui/packages/react-uploader/package.json +++ b/packages/w3ui/packages/react-uploader/package.json @@ -32,7 +32,7 @@ "dependencies": { "@w3ui/react-keyring": "workspace:^", "@w3ui/uploader-core": "workspace:^", - "@web3-storage/capabilities": "^2.2.0", + "@web3-storage/capabilities": "^4.0.0", "ariakit-react-utils": "0.17.0-next.27", "multiformats": "^11.0.1" }, diff --git a/packages/w3ui/packages/react-uploads-list/package.json b/packages/w3ui/packages/react-uploads-list/package.json index 36235048e..46b7fcacd 100644 --- a/packages/w3ui/packages/react-uploads-list/package.json +++ b/packages/w3ui/packages/react-uploads-list/package.json @@ -32,7 +32,7 @@ "dependencies": { "@w3ui/react-keyring": "workspace:^", "@w3ui/uploads-list-core": "workspace:^", - "@web3-storage/capabilities": "^2.3.0", + "@web3-storage/capabilities": "^4.0.0", "ariakit-react-utils": "0.17.0-next.27" }, "peerDependencies": { diff --git a/packages/w3ui/packages/solid-keyring/package.json b/packages/w3ui/packages/solid-keyring/package.json index 30939f838..a71ab09ab 100644 --- a/packages/w3ui/packages/solid-keyring/package.json +++ b/packages/w3ui/packages/solid-keyring/package.json @@ -28,10 +28,10 @@ }, "homepage": "https://github.com/web3-storage/w3ui/tree/main/packages/solid-keyring", "dependencies": { - "@ucanto/interface": "^4.2.3", - "@ucanto/principal": "^4.2.3", + "@ucanto/interface": "^6.2.0", + "@ucanto/principal": "^5.1.0", "@w3ui/keyring-core": "workspace:^", - "@web3-storage/access": "^9.4.0" + "@web3-storage/access": "11.0.0-rc.0" }, "peerDependencies": { "solid-js": "^1.5.0" diff --git a/packages/w3ui/packages/solid-keyring/src/providers/Keyring.ts b/packages/w3ui/packages/solid-keyring/src/providers/Keyring.ts index 107dd73ef..d3daa2511 100644 --- a/packages/w3ui/packages/solid-keyring/src/providers/Keyring.ts +++ b/packages/w3ui/packages/solid-keyring/src/providers/Keyring.ts @@ -7,6 +7,8 @@ import type { } from '@w3ui/keyring-core' import type { Agent } from '@web3-storage/access' import type { Abilities } from '@web3-storage/access/types' +import { authorizeWithSocket } from '@web3-storage/access/agent' + import type { Delegation, Capability, DID, Principal } from '@ucanto/interface' import { @@ -16,7 +18,7 @@ import { createComponent } from 'solid-js' import { createStore } from 'solid-js/store' -import { createAgent, getCurrentSpace, getSpaces } from '@w3ui/keyring-core' +import { createAgent, getCurrentSpace as getCurrentSpaceInAgent, getSpaces } from '@w3ui/keyring-core' export { KeyringContextState, KeyringContextActions } @@ -28,7 +30,8 @@ export type KeyringContextValue = [ const defaultState: KeyringContextState = { space: undefined, spaces: [], - agent: undefined + agent: undefined, + account: undefined } export const AuthContext = createContext([ @@ -47,7 +50,8 @@ export const AuthContext = createContext([ createDelegation: async () => { throw new Error('missing keyring context provider') }, - addSpace: async () => {} + addSpace: async () => {}, + authorize: async () => {} } ]) @@ -62,7 +66,8 @@ export const KeyringProvider: ParentComponent = ( const [state, setState] = createStore({ space: defaultState.space, spaces: defaultState.spaces, - agent: defaultState.agent + agent: defaultState.agent, + account: defaultState.account }) const [agent, setAgent] = createSignal() @@ -78,12 +83,34 @@ export const KeyringProvider: ParentComponent = ( }) setAgent(a) setState('agent', a.issuer) - setState('space', getCurrentSpace(a)) + setState('space', getCurrentSpaceInAgent(a)) setState('spaces', getSpaces(a)) } return a } + const authorize = async (email: '{string}@{string}'): Promise => { + const agent = await getAgent() + const controller = new AbortController() + setRegisterAbortController(controller) + + try { + await authorizeWithSocket(agent, email, { signal: controller.signal }) + // TODO is there other state that needs to be initialized? + setState('account', email) + const newSpaces = getSpaces(agent) + setState('spaces', newSpaces) + const newCurrentSpace = getCurrentSpaceInAgent(agent) ?? newSpaces[0] + if (newCurrentSpace != null) { + await setCurrentSpace(newCurrentSpace.did() as DID<'key'>) + } + } catch (error) { + if (!controller.signal.aborted) { + throw error + } + } + } + const cancelRegisterSpace = (): void => { const controller = registerAbortController() if (controller != null) { @@ -95,7 +122,7 @@ export const KeyringProvider: ParentComponent = ( const agent = await getAgent() const { did } = await agent.createSpace(name) await agent.setCurrentSpace(did) - setState('space', getCurrentSpace(agent)) + setState('space', getCurrentSpaceInAgent(agent)) return did } @@ -106,7 +133,7 @@ export const KeyringProvider: ParentComponent = ( try { await agent.registerSpace(email, { signal: controller.signal }) - setState('space', getCurrentSpace(agent)) + setState('space', getCurrentSpaceInAgent(agent)) setState('spaces', getSpaces(agent)) } catch (error) { if (!controller.signal.aborted) { @@ -117,8 +144,8 @@ export const KeyringProvider: ParentComponent = ( const setCurrentSpace = async (did: DID): Promise => { const agent = await getAgent() - await agent.setCurrentSpace(did) - setState('space', getCurrentSpace(agent)) + await agent.setCurrentSpace(did as DID<'key'>) + setState('space', getCurrentSpaceInAgent(agent)) } const loadAgent = async (): Promise => { @@ -177,7 +204,8 @@ export const KeyringProvider: ParentComponent = ( setCurrentSpace, getProofs, createDelegation, - addSpace + addSpace, + authorize } return createComponent(AuthContext.Provider, { diff --git a/packages/w3ui/packages/solid-uploader/package.json b/packages/w3ui/packages/solid-uploader/package.json index fcd42cfd5..87eb4ee62 100644 --- a/packages/w3ui/packages/solid-uploader/package.json +++ b/packages/w3ui/packages/solid-uploader/package.json @@ -30,7 +30,7 @@ "dependencies": { "@w3ui/solid-keyring": "workspace:^", "@w3ui/uploader-core": "workspace:^", - "@web3-storage/capabilities": "^2.2.0", + "@web3-storage/capabilities": "^4.0.0", "multiformats": "^11.0.1" }, "peerDependencies": { diff --git a/packages/w3ui/packages/solid-uploads-list/package.json b/packages/w3ui/packages/solid-uploads-list/package.json index 785ec1b92..b45813db0 100644 --- a/packages/w3ui/packages/solid-uploads-list/package.json +++ b/packages/w3ui/packages/solid-uploads-list/package.json @@ -30,13 +30,13 @@ "dependencies": { "@w3ui/solid-keyring": "workspace:^", "@w3ui/uploads-list-core": "workspace:^", - "@web3-storage/capabilities": "^2.2.0" + "@web3-storage/capabilities": "^4.0.0" }, "peerDependencies": { "solid-js": "^1.5.0" }, "devDependencies": { - "@ucanto/interface": "^4.2.3" + "@ucanto/interface": "^6.2.0" }, "eslintConfig": { "extends": [ diff --git a/packages/w3ui/packages/uploader-core/package.json b/packages/w3ui/packages/uploader-core/package.json index a16b4654e..c5caf6865 100644 --- a/packages/w3ui/packages/uploader-core/package.json +++ b/packages/w3ui/packages/uploader-core/package.json @@ -28,8 +28,8 @@ }, "homepage": "https://github.com/web3-storage/w3ui/tree/main/packages/uploader-core", "dependencies": { - "@ucanto/interface": "^4.2.3", - "@web3-storage/upload-client": "^6.0.0", + "@ucanto/interface": "^6.2.0", + "@web3-storage/upload-client": "^7.0.0", "multiformats": "^11.0.1" }, "eslintConfig": { diff --git a/packages/w3ui/packages/uploads-list-core/package.json b/packages/w3ui/packages/uploads-list-core/package.json index a65e4ce94..fc455cbd9 100644 --- a/packages/w3ui/packages/uploads-list-core/package.json +++ b/packages/w3ui/packages/uploads-list-core/package.json @@ -28,8 +28,8 @@ }, "homepage": "https://github.com/web3-storage/w3ui/tree/main/packages/uploads-list-core", "dependencies": { - "@ucanto/interface": "^4.2.3", - "@web3-storage/upload-client": "^6.0.0" + "@ucanto/interface": "^6.2.0", + "@web3-storage/upload-client": "^7.0.0" }, "eslintConfig": { "extends": [ diff --git a/packages/w3ui/packages/vue-keyring/package.json b/packages/w3ui/packages/vue-keyring/package.json index d43d63988..eb7487089 100644 --- a/packages/w3ui/packages/vue-keyring/package.json +++ b/packages/w3ui/packages/vue-keyring/package.json @@ -33,9 +33,9 @@ "vue": "^3.0.0" }, "devDependencies": { - "@ucanto/interface": "^4.2.3", - "@ucanto/principal": "^4.2.3", - "@web3-storage/access": "^9.4.0" + "@ucanto/interface": "^6.2.0", + "@ucanto/principal": "^5.1.0", + "@web3-storage/access": "11.0.0-rc.0" }, "eslintConfig": { "extends": [ diff --git a/packages/w3ui/packages/vue-keyring/src/providers/Keyring.ts b/packages/w3ui/packages/vue-keyring/src/providers/Keyring.ts index ba86f08d8..6bcc00451 100644 --- a/packages/w3ui/packages/vue-keyring/src/providers/Keyring.ts +++ b/packages/w3ui/packages/vue-keyring/src/providers/Keyring.ts @@ -6,12 +6,13 @@ import { Ref, shallowReactive } from 'vue' -import { createAgent, getCurrentSpace, getSpaces } from '@w3ui/keyring-core' +import { createAgent, getCurrentSpace as getCurrentSpaceInAgent, getSpaces } from '@w3ui/keyring-core' import type { KeyringContextState, KeyringContextActions, ServiceConfig } from '@w3ui/keyring-core' +import { authorizeWithSocket } from '@web3-storage/access/agent' import type { Agent } from '@web3-storage/access' import type { Capability, DID, Proof } from '@ucanto/interface' @@ -30,6 +31,7 @@ interface KeyringProviderInjectionKeyType { registerSpace: InjectionKey cancelRegisterSpace: InjectionKey getProofs: InjectionKey + authorize: InjectionKey } /** @@ -46,10 +48,11 @@ export const KeyringProviderInjectionKey: KeyringProviderInjectionKeyType = { setCurrentSpace: Symbol('w3ui keyring setCurrentSpace'), registerSpace: Symbol('w3ui keyring registerSpace'), cancelRegisterSpace: Symbol('w3ui keyring cancelRegisterSpace'), - getProofs: Symbol('w3ui keyring getProofs') + getProofs: Symbol('w3ui keyring getProofs'), + authorize: Symbol('w3ui keyring authorize') } -export interface KeyringProviderProps extends ServiceConfig {} +export interface KeyringProviderProps extends ServiceConfig { } /** * Provider for authentication with the service. @@ -59,7 +62,8 @@ export const KeyringProvider = defineComponent({ const state = shallowReactive({ agent: undefined, space: undefined, - spaces: [] + spaces: [], + account: undefined }) let agent: Agent | undefined let registerAbortController: AbortController @@ -81,12 +85,35 @@ export const KeyringProvider = defineComponent({ if (agent == null) { agent = await createAgent({ servicePrincipal, connection }) state.agent = agent.issuer - state.space = getCurrentSpace(agent) + state.space = getCurrentSpaceInAgent(agent) state.spaces = getSpaces(agent) } return agent } + provide(KeyringProviderInjectionKey.authorize, + async (email: '{string}@{string}'): Promise => { + const agent = await getAgent() + const controller = new AbortController() + registerAbortController = controller + + try { + await authorizeWithSocket(agent, email, { signal: controller.signal }) + // TODO is there other state that needs to be initialized? + state.account = email + const newSpaces = getSpaces(agent) + state.spaces = newSpaces + const newCurrentSpace = getCurrentSpaceInAgent(agent) ?? newSpaces[0] + if (newCurrentSpace != null) { + state.space = newCurrentSpace + } + } catch (error) { + if (!controller.signal.aborted) { + throw error + } + } + }) + provide(KeyringProviderInjectionKey.cancelRegisterSpace, (): void => { if (registerAbortController != null) { registerAbortController.abort() @@ -99,7 +126,7 @@ export const KeyringProvider = defineComponent({ const agent = await getAgent() const { did } = await agent.createSpace(name) await agent.setCurrentSpace(did) - state.space = getCurrentSpace(agent) + state.space = getCurrentSpaceInAgent(agent) return did } ) @@ -113,7 +140,7 @@ export const KeyringProvider = defineComponent({ try { await agent.registerSpace(email, { signal: controller.signal }) - state.space = getCurrentSpace(agent) + state.space = getCurrentSpaceInAgent(agent) state.spaces = getSpaces(agent) } catch (error) { if (!controller.signal.aborted) { @@ -127,8 +154,8 @@ export const KeyringProvider = defineComponent({ KeyringProviderInjectionKey.setCurrentSpace, async (did: DID): Promise => { const agent = await getAgent() - await agent.setCurrentSpace(did) - state.space = getCurrentSpace(agent) + await agent.setCurrentSpace(did as DID<'key'>) + state.space = getCurrentSpaceInAgent(agent) } ) diff --git a/packages/w3ui/packages/vue-uploader/package.json b/packages/w3ui/packages/vue-uploader/package.json index 6a7840915..c516986f9 100644 --- a/packages/w3ui/packages/vue-uploader/package.json +++ b/packages/w3ui/packages/vue-uploader/package.json @@ -29,7 +29,7 @@ "dependencies": { "@w3ui/uploader-core": "workspace:^", "@w3ui/vue-keyring": "workspace:^", - "@web3-storage/capabilities": "^2.2.0", + "@web3-storage/capabilities": "^4.0.0", "multiformats": "^11.0.1" }, "peerDependencies": { diff --git a/packages/w3ui/packages/vue-uploads-list/package.json b/packages/w3ui/packages/vue-uploads-list/package.json index 4cf473c49..84d7fe706 100644 --- a/packages/w3ui/packages/vue-uploads-list/package.json +++ b/packages/w3ui/packages/vue-uploads-list/package.json @@ -29,7 +29,7 @@ "dependencies": { "@w3ui/uploads-list-core": "workspace:^", "@w3ui/vue-keyring": "workspace:^", - "@web3-storage/capabilities": "^2.2.0" + "@web3-storage/capabilities": "^4.0.0" }, "peerDependencies": { "vue": "^3.0.0" diff --git a/packages/w3ui/pnpm-lock.yaml b/packages/w3ui/pnpm-lock.yaml index e23f9861d..1454bd2bc 100644 --- a/packages/w3ui/pnpm-lock.yaml +++ b/packages/w3ui/pnpm-lock.yaml @@ -18,11 +18,11 @@ importers: '@types/jest': ^29.4.0 '@types/jsdom': ^20.0.1 '@types/react': ^18.0.26 - '@ucanto/client': ^4.2.3 - '@ucanto/server': ^4.2.3 - '@ucanto/transport': ^4.2.3 + '@ucanto/client': ^5.1.0 + '@ucanto/server': ^6.1.0 + '@ucanto/transport': ^5.1.1 '@web-std/file': ^3.0.2 - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 esm: ^3.2.25 fake-indexeddb: ^4.0.1 hd-scripts: ^4.1.0 @@ -55,11 +55,11 @@ importers: '@types/jest': 29.4.0 '@types/jsdom': 20.0.1 '@types/react': 18.0.26 - '@ucanto/client': 4.2.3 - '@ucanto/server': 4.2.3 - '@ucanto/transport': 4.2.3 + '@ucanto/client': 5.1.0 + '@ucanto/server': 6.1.0 + '@ucanto/transport': 5.1.1 '@web-std/file': 3.0.2 - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 esm: 3.2.25 fake-indexeddb: 4.0.1 hd-scripts: 4.1.0 @@ -132,7 +132,7 @@ importers: '@storybook/testing-library': ^0.0.13 '@types/react': ^18.0.26 '@types/react-dom': ^18.0.9 - '@ucanto/interface': ^4.2.3 + '@ucanto/interface': ^6.2.0 '@vitejs/plugin-react': ^3.0.0 '@w3ui/keyring-core': workspace:^2.0.1 '@w3ui/react': workspace:^ @@ -167,7 +167,7 @@ importers: '@storybook/testing-library': 0.0.13_biqbaboplfbrettd7655fr4n2y '@types/react': 18.0.26 '@types/react-dom': 18.0.9 - '@ucanto/interface': 4.2.3 + '@ucanto/interface': 6.2.0 '@vitejs/plugin-react': 3.0.0_vite@4.0.3 '@w3ui/uploads-list-core': link:../../../packages/uploads-list-core multiformats: 11.0.1 @@ -240,8 +240,8 @@ importers: '@ipld/dag-ucan': ^3.2.0 '@preact/preset-vite': ^2.4.0 '@types/blueimp-md5': ^2.18.0 - '@ucanto/core': ^4.1.0 - '@ucanto/interface': ^4.1.0 + '@ucanto/core': ^5.2.0 + '@ucanto/interface': ^6.2.0 '@w3ui/keyring-core': workspace:^ '@w3ui/react-keyring': workspace:^ '@w3ui/react-uploader': workspace:^ @@ -269,8 +269,8 @@ importers: devDependencies: '@preact/preset-vite': 2.5.0_preact@10.11.3+vite@4.0.3 '@types/blueimp-md5': 2.18.0 - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 autoprefixer: 10.4.13_postcss@8.4.21 postcss: 8.4.21 tailwindcss: 3.2.4_postcss@8.4.21 @@ -462,13 +462,13 @@ importers: packages/keyring-core: specifiers: - '@ucanto/interface': ^4.2.3 - '@ucanto/principal': ^4.2.3 - '@web3-storage/access': ^9.4.0 + '@ucanto/interface': ^6.2.0 + '@ucanto/principal': ^5.1.0 + '@web3-storage/access': 11.0.0-rc.0 dependencies: - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@web3-storage/access': 9.4.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@web3-storage/access': 11.0.0-rc.0 packages/react: specifiers: @@ -490,20 +490,22 @@ importers: specifiers: '@testing-library/react': ^13.4.0 '@testing-library/user-event': ^14.4.3 - '@ucanto/interface': ^4.2.3 - '@ucanto/principal': ^4.2.3 + '@ucanto/interface': ^6.2.0 + '@ucanto/principal': ^5.1.0 '@w3ui/keyring-core': workspace:^ - '@web3-storage/access': ^9.4.0 + '@web3-storage/access': 11.0.0-rc.0 ariakit-react-utils: 0.17.0-next.27 + use-local-storage-state: ^18.2.1 dependencies: '@w3ui/keyring-core': link:../keyring-core ariakit-react-utils: 0.17.0-next.27 + use-local-storage-state: 18.2.1 devDependencies: '@testing-library/react': 13.4.0 '@testing-library/user-event': 14.4.3 - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@web3-storage/access': 9.4.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@web3-storage/access': 11.0.0-rc.0 packages/react-uploader: specifiers: @@ -511,13 +513,13 @@ importers: '@testing-library/user-event': ^14.4.3 '@w3ui/react-keyring': workspace:^ '@w3ui/uploader-core': workspace:^ - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 ariakit-react-utils: 0.17.0-next.27 multiformats: ^11.0.1 dependencies: '@w3ui/react-keyring': link:../react-keyring '@w3ui/uploader-core': link:../uploader-core - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 ariakit-react-utils: 0.17.0-next.27 multiformats: 11.0.1 devDependencies: @@ -530,12 +532,12 @@ importers: '@testing-library/user-event': ^14.4.3 '@w3ui/react-keyring': workspace:^ '@w3ui/uploads-list-core': workspace:^ - '@web3-storage/capabilities': ^2.3.0 + '@web3-storage/capabilities': ^4.0.0 ariakit-react-utils: 0.17.0-next.27 dependencies: '@w3ui/react-keyring': link:../react-keyring '@w3ui/uploads-list-core': link:../uploads-list-core - '@web3-storage/capabilities': 2.3.0 + '@web3-storage/capabilities': 4.0.0 ariakit-react-utils: 0.17.0-next.27 devDependencies: '@testing-library/react': 13.4.0 @@ -543,58 +545,58 @@ importers: packages/solid-keyring: specifiers: - '@ucanto/interface': ^4.2.3 - '@ucanto/principal': ^4.2.3 + '@ucanto/interface': ^6.2.0 + '@ucanto/principal': ^5.1.0 '@w3ui/keyring-core': workspace:^ - '@web3-storage/access': ^9.4.0 + '@web3-storage/access': 11.0.0-rc.0 dependencies: - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 '@w3ui/keyring-core': link:../keyring-core - '@web3-storage/access': 9.4.0 + '@web3-storage/access': 11.0.0-rc.0 packages/solid-uploader: specifiers: '@w3ui/solid-keyring': workspace:^ '@w3ui/uploader-core': workspace:^ - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 multiformats: ^11.0.1 dependencies: '@w3ui/solid-keyring': link:../solid-keyring '@w3ui/uploader-core': link:../uploader-core - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 multiformats: 11.0.1 packages/solid-uploads-list: specifiers: - '@ucanto/interface': ^4.2.3 + '@ucanto/interface': ^6.2.0 '@w3ui/solid-keyring': workspace:^ '@w3ui/uploads-list-core': workspace:^ - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 dependencies: '@w3ui/solid-keyring': link:../solid-keyring '@w3ui/uploads-list-core': link:../uploads-list-core - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 devDependencies: - '@ucanto/interface': 4.2.3 + '@ucanto/interface': 6.2.0 packages/uploader-core: specifiers: - '@ucanto/interface': ^4.2.3 - '@web3-storage/upload-client': ^6.0.0 + '@ucanto/interface': ^6.2.0 + '@web3-storage/upload-client': ^7.0.0 multiformats: ^11.0.1 dependencies: - '@ucanto/interface': 4.2.3 - '@web3-storage/upload-client': 6.0.0 + '@ucanto/interface': 6.2.0 + '@web3-storage/upload-client': 7.0.0 multiformats: 11.0.1 packages/uploads-list-core: specifiers: - '@ucanto/interface': ^4.2.3 - '@web3-storage/upload-client': ^6.0.0 + '@ucanto/interface': ^6.2.0 + '@web3-storage/upload-client': ^7.0.0 dependencies: - '@ucanto/interface': 4.2.3 - '@web3-storage/upload-client': 6.0.0 + '@ucanto/interface': 6.2.0 + '@web3-storage/upload-client': 7.0.0 packages/vitest-environment-w3ui: specifiers: @@ -604,38 +606,38 @@ importers: packages/vue-keyring: specifiers: - '@ucanto/interface': ^4.2.3 - '@ucanto/principal': ^4.2.3 + '@ucanto/interface': ^6.2.0 + '@ucanto/principal': ^5.1.0 '@w3ui/keyring-core': workspace:^ - '@web3-storage/access': ^9.4.0 + '@web3-storage/access': 11.0.0-rc.0 dependencies: '@w3ui/keyring-core': link:../keyring-core devDependencies: - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@web3-storage/access': 9.4.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@web3-storage/access': 11.0.0-rc.0 packages/vue-uploader: specifiers: '@w3ui/uploader-core': workspace:^ '@w3ui/vue-keyring': workspace:^ - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 multiformats: ^11.0.1 dependencies: '@w3ui/uploader-core': link:../uploader-core '@w3ui/vue-keyring': link:../vue-keyring - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 multiformats: 11.0.1 packages/vue-uploads-list: specifiers: '@w3ui/uploads-list-core': workspace:^ '@w3ui/vue-keyring': workspace:^ - '@web3-storage/capabilities': ^2.2.0 + '@web3-storage/capabilities': ^4.0.0 dependencies: '@w3ui/uploads-list-core': link:../uploads-list-core '@w3ui/vue-keyring': link:../vue-keyring - '@web3-storage/capabilities': 2.2.0 + '@web3-storage/capabilities': 4.0.0 packages: @@ -3315,32 +3317,34 @@ packages: multiformats: 11.0.1 varint: 6.0.0 - /@ipld/dag-cbor/8.0.1: - resolution: {integrity: sha512-mHRuzgGXNk0Y5W7nNQdN37qJiig1Kdgf92icBVFRUNtBc9Ezl5DIdWfiGWBucHBrhqPBncxoH3As9cHPIRozxA==} + /@ipld/car/5.1.1: + resolution: {integrity: sha512-HoFTUqUJL9cPGhC9qRmHCvamfIsj1JllQSQ/Xu9/KN/VNJp8To9Ms4qiZPEMOwcrNFclfYqrahjGYbf4KL/d9A==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 1.10.0 - multiformats: 11.0.1 + '@ipld/dag-cbor': 9.0.0 + cborg: 1.10.1 + multiformats: 11.0.2 + varint: 6.0.0 /@ipld/dag-cbor/9.0.0: resolution: {integrity: sha512-zdsiSiYDEOIDW7mmWOYWC9gukjXO+F8wqxz/LfN7iSwTfIyipC8+UQrCbPupFMRb/33XQTZk8yl3My8vUQBRoA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 1.10.0 - multiformats: 11.0.1 + cborg: 1.10.1 + multiformats: 11.0.2 /@ipld/dag-json/10.0.0: resolution: {integrity: sha512-u/PfR2sT9AiZZDUl1VNspx3OP13zuvBXAd3sKiURlSOoWfoLigxTCs+sXeaXA0hoXU7u1M2DECMt4LCUHuApSA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 1.10.0 + cborg: 1.10.1 multiformats: 11.0.1 - /@ipld/dag-pb/4.0.0: - resolution: {integrity: sha512-8FB/qTlNowCiszL9Sek8xH6xIQxIioXuzZ5B1jVPknQMVkd08nZUHzDjrn1Y6MqJ5PrXWLrBwNghGMWPPpvNVw==} + /@ipld/dag-pb/4.0.2: + resolution: {integrity: sha512-me9oEPb7UNPWSplUFCXyxnQE3/WlsjOljqO2RZN44XOmGkBY0/WVklbXorVE1eiv0Rt3p6dBS2x36Rq8A0Am8A==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 11.0.1 + multiformats: 11.0.2 dev: false /@ipld/dag-ucan/3.2.0: @@ -3350,14 +3354,16 @@ packages: '@ipld/dag-json': 10.0.0 multiformats: 11.0.1 - /@ipld/unixfs/2.0.1: - resolution: {integrity: sha512-W3LD67tLrIGpCVYFN6N/x6bL3o03zmsfd7jPAD1aXfGXaQWWa95qXPwc6PMVRTttxha/bHMKQiG2ZeFCqp83Ew==} + /@ipld/unixfs/2.1.1: + resolution: {integrity: sha512-g3gr/3XvfQs4x2VFjlICae09ul5fbWCKRInN6Vgeot2+GH0h/krr3PqZCIo4dy4Ou2mQOsIddxUvG8UZ4p9SbQ==} dependencies: - '@ipld/dag-pb': 4.0.0 + '@ipld/dag-pb': 4.0.2 + '@multiformats/murmur3': 2.1.3 + '@perma/map': 1.0.2 '@web-std/stream': 1.0.1 actor: 2.3.1 - multiformats: 11.0.1 - protobufjs: 7.2.0 + multiformats: 11.0.2 + protobufjs: 7.2.2 rabin-rs: 2.1.0 dev: false @@ -3515,8 +3521,16 @@ packages: react: 18.2.0 dev: true - /@noble/ed25519/1.7.1: - resolution: {integrity: sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==} + /@multiformats/murmur3/2.1.3: + resolution: {integrity: sha512-YvLK1IrLnRckPsvXhOkZjaIGNonsEdD1dL3NPSaLilV/WjVYeBgnNZXTUsaPzFXGrIFM7motx+yCmmqzXO6gtQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 11.0.2 + murmurhash3js-revisited: 3.0.0 + dev: false + + /@noble/ed25519/1.7.3: + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -3539,6 +3553,12 @@ packages: fastq: 1.14.0 dev: true + /@perma/map/1.0.2: + resolution: {integrity: sha512-hujwGOY6yTYnpf5YAtpD5MJAI1kcsVPqyN0lxG8Sampf/InO3jmX/MlJCHCGFPpPqB5JyO5WNnL+tUs1Umqe0A==} + dependencies: + murmurhash3js-revisited: 3.0.0 + dev: false + /@phenomnomnominal/tsquery/4.2.0_typescript@4.9.4: resolution: {integrity: sha512-hR2U3uVcrrdkuG30ItQ+uFDs4ncZAybxWG0OjTE8ptPzVoU7GVeXpy+vMU8zX9EbmjGeITPw/su5HjYQyAH8bA==} peerDependencies: @@ -3882,7 +3902,7 @@ packages: '@storybook/csf-plugin': 7.0.0-beta.29 '@storybook/csf-tools': 7.0.0-beta.29 '@storybook/global': 5.0.0 - '@storybook/mdx2-csf': 1.0.0-next.5 + '@storybook/mdx2-csf': 1.0.0-next.6 '@storybook/node-logger': 7.0.0-beta.29 '@storybook/postinstall': 7.0.0-beta.29 '@storybook/preview-api': 7.0.0-beta.29 @@ -4211,7 +4231,7 @@ packages: '@storybook/client-logger': 7.0.0-beta.29 '@storybook/core-common': 7.0.0-beta.29 '@storybook/csf-plugin': 7.0.0-beta.29 - '@storybook/mdx2-csf': 1.0.0-next.5 + '@storybook/mdx2-csf': 1.0.0-next.6 '@storybook/node-logger': 7.0.0-beta.29 '@storybook/preview': 7.0.0-beta.29 '@storybook/preview-api': 7.0.0-beta.29 @@ -4585,8 +4605,8 @@ packages: resolution: {integrity: sha512-Ha6GJXxEjqP9Z03iV7ehBKgsij0enB7GRcFstJOHjnV8WEDKfF8uPg3SHh2yfueww7P8SWS3Xc3Rzud80fJctQ==} dev: true - /@storybook/mdx2-csf/1.0.0-next.5: - resolution: {integrity: sha512-02w0sgGZaK1agT050yCVhJ+o4rLHANWvLKWjQjeAsYbjneLC5ITt+3GDB4jRiWwJboZ8dHW1fGSK1Vg5fA34aQ==} + /@storybook/mdx2-csf/1.0.0-next.6: + resolution: {integrity: sha512-m6plojocU/rmrqWd26yvm8D+oHZPZ6PtSSFmZIgpNDEPVmc8s4fBD6LXOAB5MiPI5f8KLUr2HVhOMZ97o5pDTw==} dev: true /@storybook/node-logger/7.0.0-beta.29: @@ -5069,6 +5089,11 @@ packages: /@types/node/18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + dev: true + + /@types/node/18.15.5: + resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==} + dev: false /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -5307,61 +5332,61 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@ucanto/client/4.2.3: - resolution: {integrity: sha512-vIa0drEAeolQpSePpHtsW1bx8lzDdxtXi2fEdQ4f34xbI2VSOQuAgUURJTtRVmRXa5MweQoEGI9CHPKL4CMyFQ==} + /@ucanto/client/5.1.0: + resolution: {integrity: sha512-Rr2q3ARDmiaaVnvNkPNsIhS+1ORyCqQhGRSqf8ugfJVmvbvjLFA6EYxjknUdg5tqt0aVnYTNuZ/GwIxaqMzliA==} dependencies: - '@ucanto/interface': 4.2.3 - multiformats: 11.0.1 + '@ucanto/interface': 6.2.0 + multiformats: 11.0.2 - /@ucanto/core/4.2.3: - resolution: {integrity: sha512-udvp7IMRCE3XFhPYiKISt52r8QjbrqG7d1papdtWwF6RAzTbIWhgXSwAjEbroYCr/gQst7U8aYsgr4xvG2miUQ==} + /@ucanto/core/5.2.0: + resolution: {integrity: sha512-Eblo2LfJyojRKmBk5/w25u1hhSCs6K3zUH/zNknwTrJg7CJYxw0hgsGcXrlkQf1TnSRzJVFEduK1ZzYCV55/Uw==} dependencies: - '@ipld/car': 5.1.0 + '@ipld/car': 5.1.1 '@ipld/dag-cbor': 9.0.0 '@ipld/dag-ucan': 3.2.0 - '@ucanto/interface': 4.2.3 - multiformats: 11.0.1 + '@ucanto/interface': 6.2.0 + multiformats: 11.0.2 - /@ucanto/interface/4.2.3: - resolution: {integrity: sha512-IoccqMc2/vqaPT6U061ylC138mQ3pLp6coqjXTDmlL9OHmskLcEeQh5Mxe0AYHWMhO1ZuB0LRIysBXk7xoK25Q==} + /@ucanto/interface/6.2.0: + resolution: {integrity: sha512-b37bjTxNWQE+O4f18fvb7/woe41Dvb4AfdbevPLmaJj1fZogssH9fVgWlZdVg8ZsJQhMxRyHDuH40QAvuKRR1w==} dependencies: '@ipld/dag-ucan': 3.2.0 - multiformats: 11.0.1 + multiformats: 11.0.2 - /@ucanto/principal/4.2.3: - resolution: {integrity: sha512-S02cKaMcIQhxk9uJfUCUb+f98zEEFsC+5BZC6aBoYVCEpXwVZD6+hc9xI0yIQl8zJyQVA3nnUUpLfLynsSox2A==} + /@ucanto/principal/5.1.0: + resolution: {integrity: sha512-niZzojYPYAgdszTmra82wGbl5YGHugUblMTPrEjuz3RFjXDCxW50IJFwzus3Z6k6Q6zIbXPU+yVxTbzJWg8/JA==} dependencies: '@ipld/dag-ucan': 3.2.0 - '@noble/ed25519': 1.7.1 - '@ucanto/interface': 4.2.3 - multiformats: 11.0.1 + '@noble/ed25519': 1.7.3 + '@ucanto/interface': 6.2.0 + multiformats: 11.0.2 one-webcrypto: 1.0.3 - /@ucanto/server/4.2.3: - resolution: {integrity: sha512-lmDC0d9mVGYfiqwzpiTG6CFZpGVw1GnFx9EOtozKPa+v2nzwqDAkwYAQwNrJ2nbJWQQeFi7/Jiaec9EmdPEpsg==} + /@ucanto/server/6.1.0: + resolution: {integrity: sha512-IRvYbv1iEAjgm8Rc4hqUPm2NGSU+R+X+wyHp3hUI/YdGji+bajghV4gU9klkDkgm0aqVuI1fDFyODWZb5UROtw==} dependencies: - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - '@ucanto/validator': 4.2.3 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + '@ucanto/validator': 6.1.0 dev: true - /@ucanto/transport/4.2.3: - resolution: {integrity: sha512-ZtHB5ybSB/1dBLhzJqjxGDEE+TTTNzc9HMrVA1AP5KHvaHPu2UtAmS2IMr+HrhSjcwWwdavK0qMQbXSfLWM+kg==} + /@ucanto/transport/5.1.1: + resolution: {integrity: sha512-5g2Xiofqalvmaw/UPRTdxV2be+KE3TMbFhG4ZNNPkDIBpdBduVENcLQPJ9ksD29Bc2ArIefXALxGzyGLgUPCBg==} dependencies: - '@ipld/car': 5.1.0 + '@ipld/car': 5.1.1 '@ipld/dag-cbor': 9.0.0 - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - multiformats: 11.0.1 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + multiformats: 11.0.2 - /@ucanto/validator/4.2.3: - resolution: {integrity: sha512-7lA9PK+c0Hu857eHuZIVX3ZBooqvOT25/CXUxGjqs5YFCY7dUhrNCxJYnWsPZnEdriq6x6VSj8pZPwN8I7CyQw==} + /@ucanto/validator/6.1.0: + resolution: {integrity: sha512-vZ40paByLgosllG+YfuI4eD7m3KyYG1ebEa9jZEkLDYjWh7WWBtYvBn40pziIiLfBCzum2zU1uP1SMOf63EqqQ==} dependencies: - '@ipld/car': 5.1.0 - '@ipld/dag-cbor': 8.0.1 - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - multiformats: 11.0.1 + '@ipld/car': 5.1.1 + '@ipld/dag-cbor': 9.0.0 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + multiformats: 11.0.2 /@vitejs/plugin-react/3.0.0_vite@4.0.3: resolution: {integrity: sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==} @@ -5488,26 +5513,26 @@ packages: web-streams-polyfill: 3.2.1 dev: false - /@web3-storage/access/9.4.0: - resolution: {integrity: sha512-GwrSHhOigNI009DRmRtJjqQ3JS/a+rlU7wXM7k5+FwMR9Kqr/Ayid+Ida1tN7NPEIKBqfe9wfXbVMowi86YNYw==} + /@web3-storage/access/11.0.0-rc.0: + resolution: {integrity: sha512-y3hwtlj8QhHHmK6XvzWRusm8E83jh3GkHon80wTCE0iB/BFlTNkOBeb+C5FhImC1vSFseBBG+FxLZffwfsnrYA==} hasBin: true dependencies: '@ipld/car': 5.1.0 '@ipld/dag-cbor': 9.0.0 '@ipld/dag-ucan': 3.2.0 - '@ucanto/client': 4.2.3 - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@ucanto/transport': 4.2.3 - '@ucanto/validator': 4.2.3 - '@web3-storage/capabilities': 2.3.0 + '@ucanto/client': 5.1.0 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@ucanto/transport': 5.1.1 + '@ucanto/validator': 6.1.0 + '@web3-storage/capabilities': 4.0.0 bigint-mod-arith: 3.1.2 conf: 10.2.0 inquirer: 9.1.4 isomorphic-ws: 5.0.0_ws@8.12.0 kysely: 0.23.4 - multiformats: 11.0.1 + multiformats: 11.0.2 one-webcrypto: 1.0.3 ora: 6.1.2 p-defer: 4.0.0 @@ -5521,36 +5546,37 @@ packages: - bufferutil - utf-8-validate - /@web3-storage/capabilities/2.2.0: - resolution: {integrity: sha512-TCGcpMSVQJa0CI2GzBxJSEZDdbilEe3dtXdCzwi9NWmulsnPPj3KjSil/qHW04pYtnfql4/9n4a+pxjx6iGNCA==} + /@web3-storage/capabilities/3.2.0: + resolution: {integrity: sha512-WtQNLpqfsq1v62+OJFaXUNXJsk+x8WWJZnok4tEd2p57uv1d9TeNnnWhzOo5qzGmoh1pqjlLoPjYrq78Ib9o7A==} dependencies: - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@ucanto/transport': 4.2.3 - '@ucanto/validator': 4.2.3 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@ucanto/transport': 5.1.1 + '@ucanto/validator': 6.1.0 + dev: false - /@web3-storage/capabilities/2.3.0: - resolution: {integrity: sha512-+vg61eqK1eqQ+QD1hvChDDx6CXLGFnUsEA+W+g9yagCpq+H9yAqROncEEt+oluIGvAqNbFMrUb+bWRWxk0Tmuw==} + /@web3-storage/capabilities/4.0.0: + resolution: {integrity: sha512-O+WmApepwaNFNsOj8f66HrIgDl/VGsGLn4iJMyqZdiTxVupNXfFsSVI2iBGEaJlNI+RDzISejXnGtScy1abxGQ==} dependencies: - '@ucanto/core': 4.2.3 - '@ucanto/interface': 4.2.3 - '@ucanto/principal': 4.2.3 - '@ucanto/transport': 4.2.3 - '@ucanto/validator': 4.2.3 + '@ucanto/core': 5.2.0 + '@ucanto/interface': 6.2.0 + '@ucanto/principal': 5.1.0 + '@ucanto/transport': 5.1.1 + '@ucanto/validator': 6.1.0 - /@web3-storage/upload-client/6.0.0: - resolution: {integrity: sha512-oJ1/cLBSap25j2ZfC1RNOW9IisOnWMX2ay7sAWY9KPDiWe/coBXDOQB3vXxtPWSIBID6+SOSGaHh3+kXv8b4yg==} + /@web3-storage/upload-client/7.0.0: + resolution: {integrity: sha512-zPAdnay60PzKKqClXRWxGukdTiMFustmgcDmrWf7PAISZSoP2gvc5WFHYYY0NGlSOsgDUwN4zgl8noGsQQFisQ==} dependencies: - '@ipld/car': 5.1.0 + '@ipld/car': 5.1.1 '@ipld/dag-ucan': 3.2.0 - '@ipld/unixfs': 2.0.1 - '@ucanto/client': 4.2.3 - '@ucanto/interface': 4.2.3 - '@ucanto/transport': 4.2.3 - '@web3-storage/capabilities': 2.3.0 - multiformats: 11.0.1 - p-queue: 7.3.0 + '@ipld/unixfs': 2.1.1 + '@ucanto/client': 5.1.0 + '@ucanto/interface': 6.2.0 + '@ucanto/transport': 5.1.1 + '@web3-storage/capabilities': 3.2.0 + multiformats: 11.0.2 + p-queue: 7.3.4 p-retry: 5.1.2 dev: false @@ -6406,6 +6432,10 @@ packages: resolution: {integrity: sha512-/eM0JCaL99HDHxjySNQJLaolZFVdl6VA0/hEKIoiQPcQzE5LrG5QHdml0HaBt31brgB9dNe1zMr3f8IVrpotRQ==} hasBin: true + /cborg/1.10.1: + resolution: {integrity: sha512-et6Qm8MOUY2kCWa5GKk2MlBVoPjHv0hQBmlzI/Z7+5V3VJCeIkGehIB3vWknNsm2kOkAIs6wEKJFJo8luWQQ/w==} + hasBin: true + /chai/4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -10242,6 +10272,15 @@ packages: resolution: {integrity: sha512-atWruyH34YiknSdL5yeIir00EDlJRpHzELYQxG7Iy29eCyL+VrZHpPrX5yqlik3jnuqpLpRKVZ0SGVb9UzKaSA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} + /multiformats/11.0.2: + resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + /murmurhash3js-revisited/3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + dev: false + /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -10604,8 +10643,8 @@ packages: aggregate-error: 3.1.0 dev: true - /p-queue/7.3.0: - resolution: {integrity: sha512-5fP+yVQ0qp0rEfZoDTlP2c3RYBgxvRsw30qO+VtPPc95lyvSG+x6USSh1TuLB4n96IO6I8/oXQGsTgtna4q2nQ==} + /p-queue/7.3.4: + resolution: {integrity: sha512-esox8CWt0j9EZECFvkFl2WNPat8LN4t7WWeXq73D9ha0V96qPRufApZi4ZhPwXAln1uVVal429HVVKPa2X0yQg==} engines: {node: '>=12'} dependencies: eventemitter3: 4.0.7 @@ -10995,8 +11034,8 @@ packages: xtend: 4.0.2 dev: false - /protobufjs/7.2.0: - resolution: {integrity: sha512-hYCqTDuII4iJ4stZqiuGCSU8xxWl5JeXYpwARGtn/tWcKCAro6h3WQz+xpsNbXW0UYqpmTQFEyFWO0G0Kjt64g==} + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -11010,7 +11049,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.11.18 + '@types/node': 18.15.5 long: 5.2.1 dev: false @@ -12642,7 +12681,7 @@ packages: resolution: {integrity: sha512-b+aKlI2oTnxnfeSQWV1sMacqSNxqhtXySaH6bflvONGxF8V/fT3ZlYH7z2qgGfydsvpVo4JUgM/Ylyfl2YouCg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 11.0.1 + multiformats: 11.0.2 /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -12793,6 +12832,14 @@ packages: requires-port: 1.0.0 dev: true + /use-local-storage-state/18.2.1: + resolution: {integrity: sha512-JgFWmMIIsN3uIQ2hSDhYGiYdfykMFVPNX/vz5JX/9V1igJSUjEe30CgswH076YqBx4Njea1NJ6B4farIlnSLuA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + dev: false + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'}