ipfs-http-client
Version:
A client library for the IPFS HTTP API
71 lines (61 loc) • 2.36 kB
JavaScript
import { CID } from 'multiformats/cid'
import { configure } from '../lib/configure.js'
import { multipartRequest } from 'ipfs-core-utils/multipart-request'
import { toUrlSearchParams } from '../lib/to-url-search-params.js'
import { abortSignal } from '../lib/abort-signal.js'
/**
* @typedef {import('../types').HTTPClientExtraOptions} HTTPClientExtraOptions
* @typedef {import('ipfs-core-types/src/dag').API<HTTPClientExtraOptions>} DAGAPI
*/
/**
* @param {import('ipfs-core-utils/multicodecs').Multicodecs} codecs
* @param {import('../types').Options} options
*/
export const createPut = (codecs, options) => {
const fn = configure((api) => {
/**
* @type {DAGAPI["put"]}
*/
const put = async (dagNode, options = {}) => {
const settings = {
storeCodec: 'dag-cbor',
hashAlg: 'sha2-256',
...options
}
let serialized
if (settings.inputCodec) {
// if you supply an inputCodec, we assume you're passing in a raw, encoded
// block using that codec, so we'll just pass that on to the server and let
// it deal with the decode/encode/store cycle
if (!(dagNode instanceof Uint8Array)) {
throw new Error('Can only inputCodec on raw bytes that can be decoded')
}
serialized = dagNode
} else {
// if you don't supply an inputCodec, we assume you've passed in a JavaScript
// object you want to have encoded using storeCodec, so we'll prepare it for
// you if we have the codec
const storeCodec = await codecs.getCodec(settings.storeCodec)
serialized = storeCodec.encode(dagNode)
// now we have a serialized form, the server should be told to receive it
// in that format
settings.inputCodec = settings.storeCodec
}
// allow aborting requests on body errors
const controller = new AbortController()
const signal = abortSignal(controller.signal, settings.signal)
const res = await api.post('dag/put', {
timeout: settings.timeout,
signal,
searchParams: toUrlSearchParams(settings),
...(
await multipartRequest([serialized], controller, settings.headers)
)
})
const data = await res.json()
return CID.parse(data.Cid['/'])
}
return put
})
return fn(options)
}