kubo-rpc-client
Version:
A client library for the Kubo RPC API
50 lines • 2.16 kB
JavaScript
import { anySignal } from 'any-signal';
import { CID } from 'multiformats/cid';
import { multipartRequest } from '../lib/multipart-request.js';
import { toUrlSearchParams } from '../lib/to-url-search-params.js';
export function createPut(client, codecs) {
return async function put(dagNode, options = {}) {
const settings = {
storeCodec: 'dag-cbor',
hashAlg: 'sha2-256',
...options
};
let serialized;
if (settings.inputCodec != null) {
// 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 ?? 'dag-cbor');
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 = anySignal([controller.signal, settings.signal]);
try {
const res = await client.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['/']);
}
finally {
signal.clear();
}
};
}
//# sourceMappingURL=put.js.map