@web3-storage/w3cli
Version:
💾 w3 command line interface
129 lines (118 loc) • 3.94 kB
JavaScript
import * as API from '../../api.js'
import {
createContext,
cleanupContext,
} from '@web3-storage/upload-api/test/context'
import { createEnv } from './env.js'
import { Signer } from '@ucanto/principal/ed25519'
import { createServer as createHTTPServer } from './http-server.js'
import { createReceiptsServer } from './receipt-http-server.js'
import http from 'node:http'
import { StoreConf } from '@web3-storage/w3up-client/stores/conf'
import * as FS from 'node:fs/promises'
/** did:key:z6Mkqa4oY9Z5Pf5tUcjLHLUsDjKwMC95HGXdE1j22jkbhz6r */
export const alice = Signer.parse(
'MgCZT5vOnYZoVAeyjnzuJIVY9J4LNtJ+f8Js0cTPuKUpFne0BVEDJjEu6quFIU8yp91/TY/+MYK8GvlKoTDnqOCovCVM='
)
/** did:key:z6MkffDZCkCTWreg8868fG1FGFogcJj5X6PY93pPcWDn9bob */
export const bob = Signer.parse(
'MgCYbj5AJfVvdrjkjNCxB3iAUwx7RQHVQ7H1sKyHy46Iose0BEevXgL1V73PD9snOCIoONgb+yQ9sycYchQC8kygR4qY='
)
/** did:key:z6MktafZTREjJkvV5mfJxcLpNBoVPwDLhTuMg9ng7dY4zMAL */
export const mallory = Signer.parse(
'MgCYtH0AvYxiQwBG6+ZXcwlXywq9tI50G2mCAUJbwrrahkO0B0elFYkl3Ulf3Q3A/EvcVY0utb4etiSE8e6pi4H0FEmU='
)
export { createContext, cleanupContext }
/**
* @typedef {Awaited<ReturnType<createContext>>} UcantoServerTestContext
*
* @param {UcantoServerTestContext} context
* @param {object} input
* @param {API.DIDKey} input.space
* @param {API.DID<'mailto'>} input.account
* @param {API.DID<'web'>} input.provider
*/
export const provisionSpace = async (context, { space, account, provider }) => {
// add a provider for this space
return await context.provisionsStorage.put({
cause: /** @type {*} */ ({}),
consumer: space,
customer: account,
provider,
})
}
/**
* @typedef {import('@web3-storage/w3up-client/types').StoreAddSuccess} StoreAddSuccess
* @typedef {UcantoServerTestContext & {
* server: import('./http-server').TestingServer['server']
* receiptsServer: import('./receipt-http-server.js').TestingServer['server']
* router: import('./http-server').Router
* env: { alice: Record<string, string>, bob: Record<string, string> }
* serverURL: URL
* }} Context
*
* @returns {Promise<Context>}
*/
export const setup = async () => {
const context = await createContext({ http })
const { server, serverURL, router } = await createHTTPServer({
'/': context.connection.channel.request.bind(context.connection.channel),
})
const { server: receiptsServer, serverURL: receiptsServerUrl } = await createReceiptsServer()
return Object.assign(context, {
server,
serverURL,
receiptsServer,
router,
serverRouter: router,
env: {
alice: createEnv({
storeName: `w3cli-test-alice-${context.service.did()}`,
servicePrincipal: context.service,
serviceURL: serverURL,
receiptsEndpoint: new URL('receipt', receiptsServerUrl),
}),
bob: createEnv({
storeName: `w3cli-test-bob-${context.service.did()}`,
servicePrincipal: context.service,
serviceURL: serverURL,
receiptsEndpoint: new URL('receipt', receiptsServerUrl),
}),
},
})
}
/**
* @param {Context} context
*/
export const teardown = async (context) => {
await cleanupContext(context)
context.server.close()
context.receiptsServer.close()
const stores = [
context.env.alice.W3_STORE_NAME,
context.env.bob.W3_STORE_NAME,
]
await Promise.all(
stores.map(async (name) => {
const { path } = new StoreConf({ profile: name })
try {
await FS.rm(path)
} catch (/** @type {any} */ err) {
if (err.code === 'ENOENT') return // is ok maybe it wasn't used in the test
throw err
}
})
)
}
/**
* @param {(assert: import('entail').Assert, context: Context) => unknown} unit
* @returns {import('entail').Test}
*/
export const test = (unit) => async (assert) => {
const context = await setup()
try {
await unit(assert, context)
} finally {
await teardown(context)
}
}