Sign In

web3.storage

Package Overview
Dependencies
Maintainers
2
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

web3.storage - npm Package Compare versions

Comparing version
4.0.0
to
4.1.0
+47
-10
dist/src/lib.cjs

@@ -13,2 +13,3 @@ 'use strict';

var filesFromPath = require('files-from-path');
var throttledQueue = require('throttled-queue');
var fetch = require('@web-std/fetch');

@@ -22,2 +23,3 @@ var blob = require('@web-std/blob');

var pRetry__default = /*#__PURE__*/_interopDefaultLegacy(pRetry);
var throttledQueue__default = /*#__PURE__*/_interopDefaultLegacy(throttledQueue);
var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);

@@ -46,2 +48,5 @@

const MAX_CHUNK_SIZE = 104857600;
// These match what is enforced server-side
const RATE_LIMIT_REQUESTS = 30;
const RATE_LIMIT_PERIOD = 10 * 1000;

@@ -57,2 +62,3 @@ /** @typedef { import('./lib/interface.js').API } API */

/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */
/** @typedef { import('./lib/interface.js').RateLimiter } RateLimiter */
/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */

@@ -62,2 +68,20 @@ /** @typedef { import('./lib/interface.js').Web3Response} Web3Response */

/**
* Creates a rate limiter which limits at the same rate as is enforced
* server-side, to allow the client to avoid exceeding the requests limit and
* being blocked for 30 seconds.
* @returns {RateLimiter}
*/
function createRateLimiter () {
const throttle = throttledQueue__default["default"](RATE_LIMIT_REQUESTS, RATE_LIMIT_PERIOD);
return () => throttle(() => {})
}
/**
* Rate limiter used by static API if no rate limiter is passed. Note that each
* instance of the Web3Storage class gets it's own limiter if none is passed.
* This is because rate limits are enforced per API token.
*/
const globalRateLimiter = createRateLimiter();
/**
* @implements Service

@@ -76,5 +100,9 @@ */

*
* @param {{token: string, endpoint?:URL}} options
* @param {{token: string, endpoint?:URL, rateLimiter?: RateLimiter}} options
*/
constructor ({ token, endpoint = new URL('https://api.web3.storage') }) {
constructor ({
token,
endpoint = new URL('https://api.web3.storage'),
rateLimiter
}) {
/**

@@ -91,2 +119,6 @@ * Authorization token.

this.endpoint = endpoint;
/**
* @readonly
*/
this.rateLimiter = rateLimiter || createRateLimiter();
}

@@ -113,3 +145,3 @@

*/
static async put ({ endpoint, token }, files, {
static async put ({ endpoint, token, rateLimiter = globalRateLimiter }, files, {
onRootCidReady,

@@ -136,3 +168,3 @@ onStoredChunk,

const car$1 = await car.CarReader.fromIterable(out);
return await Web3Storage.putCar({ endpoint, token }, car$1, { onStoredChunk, maxRetries, maxChunkSize, name })
return await Web3Storage.putCar({ endpoint, token, rateLimiter }, car$1, { onStoredChunk, maxRetries, maxChunkSize, name })
} finally {

@@ -149,3 +181,3 @@ await blockstore.close();

*/
static async putCar ({ endpoint, token }, car, {
static async putCar ({ endpoint, token, rateLimiter = globalRateLimiter }, car, {
name,

@@ -192,2 +224,3 @@ onStoredChunk,

async () => {
await rateLimiter();
const request = await fetch__default["default"](url.toString(), {

@@ -229,4 +262,5 @@ method: 'POST',

*/
static async get ({ endpoint, token }, cid) {
static async get ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
const url = new URL(`car/${cid}`, endpoint);
await rateLimiter();
const res = await fetch__default["default"](url.toString(), {

@@ -249,4 +283,4 @@ method: 'GET',

/* c8 ignore next 4 */
static async delete ({ endpoint, token }, cid) {
console.log('Not deleting', cid, endpoint, token);
static async delete ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
console.log('Not deleting', cid, endpoint, token, rateLimiter);
throw Error('.delete not implemented yet')

@@ -260,4 +294,5 @@ }

*/
static async status ({ endpoint, token }, cid) {
static async status ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
const url = new URL(`status/${cid}`, endpoint);
await rateLimiter();
const res = await fetch__default["default"](url.toString(), {

@@ -293,5 +328,6 @@ method: 'GET',

*/
function listPage ({ endpoint, token }, { before, size }) {
async function listPage ({ endpoint, token, rateLimiter = globalRateLimiter }, { before, size }) {
const search = new URLSearchParams({ before, size: size.toString() });
const url = new URL(`user/uploads?${search}`, endpoint);
await rateLimiter();
return fetch__default["default"](url.toString(), {

@@ -565,2 +601,3 @@ method: 'GET',

exports.Web3Storage = Web3Storage;
exports.createRateLimiter = createRateLimiter;
//# sourceMappingURL=lib.cjs.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"lib.cjs","sources":["../../src/lib.js"],"sourcesContent":["/**\n * A client library for the https://web3.storage/ service. It provides a convenient\n * interface for working with the [Raw HTTP API](https://web3.storage/#api-docs)\n * from a web browser or [Node.js](https://nodejs.org/) and comes bundled with\n * TS for out-of-the box type inference and better IntelliSense.\n *\n * @example\n * ```js\n * import { Web3Storage, File } from 'web3.storage'\n * const client = new Web3Storage({ token: API_TOKEN })\n *\n * const cid = await client.put([new File(['hello world'], 'hello.txt', { type: 'text/plain' })])\n * ```\n * @module\n */\nimport { transform } from 'streaming-iterables'\nimport pRetry from 'p-retry'\nimport { pack } from 'ipfs-car/pack'\nimport { parseLinkHeader } from '@web3-storage/parse-link-header'\nimport { unpackStream } from 'ipfs-car/unpack'\nimport { TreewalkCarSplitter } from 'carbites/treewalk'\nimport { CarReader } from '@ipld/car'\nimport { filesFromPath, getFilesFromPath } from 'files-from-path'\nimport {\n fetch,\n File,\n Blob,\n Blockstore\n} from './platform.js'\n\nconst MAX_PUT_RETRIES = 5\nconst MAX_CONCURRENT_UPLOADS = 3\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024 * 10 // chunk to ~10MB CARs\nconst MAX_BLOCK_SIZE = 1048576\nconst MAX_CHUNK_SIZE = 104857600\n\n/** @typedef { import('./lib/interface.js').API } API */\n/** @typedef { import('./lib/interface.js').Status} Status */\n/** @typedef { import('./lib/interface.js').Upload} Upload */\n/** @typedef { import('./lib/interface.js').Service } Service */\n/** @typedef { import('./lib/interface.js').Web3File} Web3File */\n/** @typedef { import('./lib/interface.js').Filelike } Filelike */\n/** @typedef { import('./lib/interface.js').CIDString} CIDString */\n/** @typedef { import('./lib/interface.js').PutOptions} PutOptions */\n/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */\n/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */\n/** @typedef { import('./lib/interface.js').Web3Response} Web3Response */\n\n/**\n * @implements Service\n */\nclass Web3Storage {\n /**\n * Constructs a client bound to the given `options.token` and\n * `options.endpoint`.\n *\n * @example\n * ```js\n * import { Web3Storage } from 'web3.storage'\n * const client = new Web3Storage({ token: API_TOKEN })\n * ```\n *\n * @param {{token: string, endpoint?:URL}} options\n */\n constructor ({ token, endpoint = new URL('https://api.web3.storage') }) {\n /**\n * Authorization token.\n *\n * @readonly\n */\n this.token = token\n /**\n * Service API endpoint `URL`.\n * @readonly\n */\n this.endpoint = endpoint\n }\n\n /**\n * @hidden\n * @param {string} token\n * @returns {Record<string, string>}\n */\n static headers (token) {\n if (!token) throw new Error('missing token')\n return {\n Authorization: `Bearer ${token}`,\n 'X-Client': 'web3.storage/js'\n }\n }\n\n /**\n * @param {Service} service\n * @param {Iterable<Filelike>} files\n * @param {PutOptions} [options]\n * @returns {Promise<CIDString>}\n */\n static async put ({ endpoint, token }, files, {\n onRootCidReady,\n onStoredChunk,\n maxRetries = MAX_PUT_RETRIES,\n maxChunkSize = DEFAULT_CHUNK_SIZE,\n wrapWithDirectory = true,\n name\n } = {}) {\n if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n }\n const blockstore = new Blockstore()\n try {\n const { out, root } = await pack({\n input: Array.from(files).map(toImportCandidate),\n blockstore,\n wrapWithDirectory,\n maxChunkSize: MAX_BLOCK_SIZE,\n maxChildrenPerNode: 1024\n })\n onRootCidReady && onRootCidReady(root.toString())\n const car = await CarReader.fromIterable(out)\n return await Web3Storage.putCar({ endpoint, token }, car, { onStoredChunk, maxRetries, maxChunkSize, name })\n } finally {\n await blockstore.close()\n }\n }\n\n /**\n * @param {Service} service\n * @param {import('@ipld/car/api').CarReader} car\n * @param {PutCarOptions} [options]\n * @returns {Promise<CIDString>}\n */\n static async putCar ({ endpoint, token }, car, {\n name,\n onStoredChunk,\n maxRetries = MAX_PUT_RETRIES,\n maxChunkSize = DEFAULT_CHUNK_SIZE,\n decoders\n } = {}) {\n if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n }\n const targetSize = maxChunkSize\n const url = new URL('car', endpoint)\n let headers = Web3Storage.headers(token)\n\n if (name) {\n headers = { ...headers, 'X-Name': encodeURIComponent(name) }\n }\n\n const roots = await car.getRoots()\n if (roots[0] == null) {\n throw new Error('missing root CID')\n }\n if (roots.length > 1) {\n throw new Error('too many roots')\n }\n\n const carRoot = roots[0].toString()\n const splitter = new TreewalkCarSplitter(car, targetSize, { decoders })\n\n /**\n * @param {AsyncIterable<Uint8Array>} car\n * @returns {Promise<CIDString>}\n */\n const onCarChunk = async car => {\n const carParts = []\n for await (const part of car) {\n carParts.push(part)\n }\n\n const carFile = new Blob(carParts, { type: 'application/car' })\n const res = await pRetry(\n async () => {\n const request = await fetch(url.toString(), {\n method: 'POST',\n headers,\n body: carFile\n })\n /* c8 ignore next 3 */\n if (request.status === 429) {\n throw new Error('rate limited')\n }\n const res = await request.json()\n if (!request.ok) {\n throw new Error(res.message)\n }\n\n if (res.cid !== carRoot) {\n throw new Error(`root CID mismatch, expected: ${carRoot}, received: ${res.cid}`)\n }\n return res.cid\n },\n { retries: maxRetries }\n )\n\n onStoredChunk && onStoredChunk(carFile.size)\n return res\n }\n\n const upload = transform(MAX_CONCURRENT_UPLOADS, onCarChunk)\n for await (const _ of upload(splitter.cars())) {} // eslint-disable-line\n return carRoot\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<Web3Response | null>}\n */\n static async get ({ endpoint, token }, cid) {\n const url = new URL(`car/${cid}`, endpoint)\n const res = await fetch(url.toString(), {\n method: 'GET',\n headers: Web3Storage.headers(token)\n })\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n return toWeb3Response(res)\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<CIDString>}\n */\n /* c8 ignore next 4 */\n static async delete ({ endpoint, token }, cid) {\n console.log('Not deleting', cid, endpoint, token)\n throw Error('.delete not implemented yet')\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<Status | undefined>}\n */\n static async status ({ endpoint, token }, cid) {\n const url = new URL(`status/${cid}`, endpoint)\n const res = await fetch(url.toString(), {\n method: 'GET',\n headers: Web3Storage.headers(token)\n })\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n if (res.status === 404) {\n return undefined\n }\n if (!res.ok) {\n throw new Error(res.statusText)\n }\n return res.json()\n }\n\n /**\n * @param {Service} service\n * @param {object} [opts]\n * @param {string} [opts.before] list items uploaded before this ISO 8601 date string\n * @param {number} [opts.maxResults] maximum number of results to return\n * @returns {AsyncIterable<Upload>}\n */\n static async * list (service, { before = new Date().toISOString(), maxResults = Infinity } = {}) {\n /**\n * @param {Service} service\n * @param {{before: string, size: number}} opts\n * @returns {Promise<Response>}\n */\n function listPage ({ endpoint, token }, { before, size }) {\n const search = new URLSearchParams({ before, size: size.toString() })\n const url = new URL(`user/uploads?${search}`, endpoint)\n return fetch(url.toString(), {\n method: 'GET',\n headers: {\n ...Web3Storage.headers(token),\n 'Access-Control-Request-Headers': 'Link'\n }\n })\n }\n let count = 0\n const size = maxResults > 100 ? 100 : maxResults\n for await (const res of paginator(listPage, service, { before, size })) {\n if (!res.ok) {\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n\n /* c8 ignore next 2 */\n const errorMessage = await res.json()\n throw new Error(`${res.status} ${res.statusText} ${errorMessage ? '- ' + errorMessage.message : ''}`)\n }\n const page = await res.json()\n for (const upload of page) {\n if (++count > maxResults) {\n return\n }\n yield upload\n }\n }\n }\n\n // Just a sugar so you don't have to pass around endpoint and token around.\n\n /**\n * Uploads files to web3.storage. Files are hashed in the client and uploaded as a single\n * [Content Addressed Archive(CAR)](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md).\n * Takes a [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob)\n *\n * Returns the corresponding Content Identifier (CID).\n *\n * @example\n * ```js\n * const file = new File(['hello world'], 'hello.txt', { type: 'text/plain' })\n * const cid = await client.put([file])\n * ```\n * @param {Iterable<Filelike>} files\n * @param {PutOptions} [options]\n */\n put (files, options) {\n return Web3Storage.put(this, files, options)\n }\n\n /**\n * Uploads a CAR ([Content Addressed Archive](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md)) file to web3.storage.\n * Takes a CarReader interface from @ipld/car\n *\n * Returns the corresponding Content Identifier (CID).\n *\n * @example\n * ```js\n * import fs from 'fs'\n * import { Readable } from 'stream'\n * import { CarReader, CarWriter } from '@ipld/car'\n * import * as raw from 'multiformats/codecs/raw'\n * import { CID } from 'multiformats/cid'\n * import { sha256 } from 'multiformats/hashes/sha2'\n *\n * async function getCar() {\n * const bytes = new TextEncoder().encode('random meaningless bytes')\n * const hash = await sha256.digest(raw.encode(bytes))\n * const cid = CID.create(1, raw.code, hash)\n *\n * // create the writer and set the header with a single root\n * const { writer, out } = await CarWriter.create([cid])\n * Readable.from(out).pipe(fs.createWriteStream('example.car'))\n\n * // store a new block, creates a new file entry in the CAR archive\n * await writer.put({ cid, bytes })\n * await writer.close()\n\n * const inStream = fs.createReadStream('example.car')\n * // read and parse the entire stream in one go, this will cache the contents of\n * // the car in memory so is not suitable for large files.\n * const reader = await CarReader.fromIterable(inStream)\n * return reader\n * }\n *\n * const car = await getCar()\n * const cid = await client.putCar(car)\n * ```\n * @param {import('@ipld/car/api').CarReader} car\n * @param {PutCarOptions} [options]\n */\n putCar (car, options) {\n return Web3Storage.putCar(this, car, options)\n }\n\n /**\n * Fetch the Content Addressed Archive by its root CID.\n * @param {CIDString} cid\n */\n get (cid) {\n return Web3Storage.get(this, cid)\n }\n\n /**\n * @param {CIDString} cid\n */\n /* c8 ignore next 3 */\n delete (cid) {\n return Web3Storage.delete(this, cid)\n }\n\n /**\n * Fetch info on Filecoin deals and IPFS pins that a given CID is replicated in.\n * @param {CIDString} cid\n */\n status (cid) {\n return Web3Storage.status(this, cid)\n }\n\n /**\n * Find all uploads for this account. Use a `for await...of` loop to fetch them all.\n * @example\n * Fetch all the uploads\n * ```js\n * const uploads = []\n * for await (const item of client.list()) {\n * uploads.push(item)\n * }\n * ```\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of\n * @param {object} [opts]\n * @param {string} [opts.before] list items uploaded before this ISO 8601 date string\n * @param {number} [opts.maxResults] maximum number of results to return\n * @returns {AsyncIterable<Upload>}\n */\n list (opts) {\n return Web3Storage.list(this, opts)\n }\n}\n\n/**\n * Map a UnixFSEntry to a File with a cid property\n * @param {UnixFSEntry} entry\n * @returns {Promise<Web3File>}\n */\nasync function toWeb3File ({ content, path, cid }) {\n const chunks = []\n for await (const chunk of content()) {\n chunks.push(chunk)\n }\n const file = new File(chunks, toFilenameWithPath(path))\n return Object.assign(file, { cid: cid.toString() })\n}\n\n/**\n * Trim the root cid from the path if there is anyting after it.\n * bafy...ic2q/path/to/pinpie.jpg => path/to/pinpie.jpg\n * bafy...ic2q/pinpie.jpg => pinpie.jpg\n * bafk...52zy => bafk...52zy\n * @param {string} unixFsPath\n * @returns {string}\n */\nfunction toFilenameWithPath (unixFsPath) {\n const slashIndex = unixFsPath.indexOf('/')\n return slashIndex === -1 ? unixFsPath : unixFsPath.substring(slashIndex + 1)\n}\n\n/**\n * Add car unpacking smarts to the response object,\n * @param {Response} res\n * @returns {Web3Response}\n */\nfunction toWeb3Response (res) {\n const response = Object.assign(res, {\n unixFsIterator: async function * () {\n if (!res.ok) {\n throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .unixFsIterator`)\n }\n /* c8 ignore next 3 */\n if (!res.body) {\n throw new Error('No body on response')\n }\n const blockstore = new Blockstore()\n try {\n for await (const entry of unpackStream(res.body, { blockstore })) {\n yield entry\n }\n } finally {\n await blockstore.close()\n }\n },\n files: async () => {\n if (!res.ok) {\n throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .files`)\n }\n const files = []\n // @ts-ignore we're using the enriched response here\n for await (const entry of response.unixFsIterator()) {\n if (entry.type === 'directory') {\n continue\n }\n const file = await toWeb3File(entry)\n files.push(file)\n }\n return files\n }\n })\n return response\n}\n\n/**\n * Convert the passed file to an \"import candidate\" - an object suitable for\n * passing to the ipfs-unixfs-importer. Note: content is an accessor so that\n * the stream is only created when needed.\n *\n * @param {Filelike} file\n */\nfunction toImportCandidate (file) {\n /** @type {ReadableStream} */\n let stream\n return {\n path: file.name,\n get content () {\n stream = stream || file.stream()\n return stream\n }\n }\n}\n\n/**\n * Follow Link headers on a Response, to fetch all the things.\n *\n * @param {(service: Service, opts: any) => Promise<Response>} fn\n * @param {Service} service\n * @param {{}} opts\n */\nasync function * paginator (fn, service, opts) {\n let res = await fn(service, opts)\n yield res\n let link = parseLinkHeader(res.headers.get('Link') || '')\n // @ts-ignore\n while (link && link.next) {\n // @ts-ignore\n res = await fn(service, link.next)\n yield res\n link = parseLinkHeader(res.headers.get('Link') || '')\n }\n}\n\nexport { Web3Storage, File, Blob, filesFromPath, getFilesFromPath }\n\n/**\n * Just to verify API compatibility.\n * TODO: convert lib to a regular class that can be type checked.\n * @type {API}\n */\nconst api = Web3Storage\nvoid api // eslint-disable-line no-void\n"],"names":["Blockstore","pack","car","CarReader","TreewalkCarSplitter","Blob","pRetry","fetch","transform","file","File","unpackStream","parseLinkHeader"],"mappings":"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"}
{"version":3,"file":"lib.cjs","sources":["../../src/lib.js"],"sourcesContent":["/**\n * A client library for the https://web3.storage/ service. It provides a convenient\n * interface for working with the [Raw HTTP API](https://web3.storage/#api-docs)\n * from a web browser or [Node.js](https://nodejs.org/) and comes bundled with\n * TS for out-of-the box type inference and better IntelliSense.\n *\n * @example\n * ```js\n * import { Web3Storage, File } from 'web3.storage'\n * const client = new Web3Storage({ token: API_TOKEN })\n *\n * const cid = await client.put([new File(['hello world'], 'hello.txt', { type: 'text/plain' })])\n * ```\n * @module\n */\nimport { transform } from 'streaming-iterables'\nimport pRetry from 'p-retry'\nimport { pack } from 'ipfs-car/pack'\nimport { parseLinkHeader } from '@web3-storage/parse-link-header'\nimport { unpackStream } from 'ipfs-car/unpack'\nimport { TreewalkCarSplitter } from 'carbites/treewalk'\nimport { CarReader } from '@ipld/car'\nimport { filesFromPath, getFilesFromPath } from 'files-from-path'\nimport throttledQueue from 'throttled-queue'\nimport {\n fetch,\n File,\n Blob,\n Blockstore\n} from './platform.js'\n\nconst MAX_PUT_RETRIES = 5\nconst MAX_CONCURRENT_UPLOADS = 3\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024 * 10 // chunk to ~10MB CARs\nconst MAX_BLOCK_SIZE = 1048576\nconst MAX_CHUNK_SIZE = 104857600\n// These match what is enforced server-side\nconst RATE_LIMIT_REQUESTS = 30\nconst RATE_LIMIT_PERIOD = 10 * 1000\n\n/** @typedef { import('./lib/interface.js').API } API */\n/** @typedef { import('./lib/interface.js').Status} Status */\n/** @typedef { import('./lib/interface.js').Upload} Upload */\n/** @typedef { import('./lib/interface.js').Service } Service */\n/** @typedef { import('./lib/interface.js').Web3File} Web3File */\n/** @typedef { import('./lib/interface.js').Filelike } Filelike */\n/** @typedef { import('./lib/interface.js').CIDString} CIDString */\n/** @typedef { import('./lib/interface.js').PutOptions} PutOptions */\n/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */\n/** @typedef { import('./lib/interface.js').RateLimiter } RateLimiter */\n/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */\n/** @typedef { import('./lib/interface.js').Web3Response} Web3Response */\n\n/**\n * Creates a rate limiter which limits at the same rate as is enforced\n * server-side, to allow the client to avoid exceeding the requests limit and\n * being blocked for 30 seconds.\n * @returns {RateLimiter}\n */\nexport function createRateLimiter () {\n const throttle = throttledQueue(RATE_LIMIT_REQUESTS, RATE_LIMIT_PERIOD)\n return () => throttle(() => {})\n}\n\n/**\n * Rate limiter used by static API if no rate limiter is passed. Note that each\n * instance of the Web3Storage class gets it's own limiter if none is passed.\n * This is because rate limits are enforced per API token.\n */\nconst globalRateLimiter = createRateLimiter()\n\n/**\n * @implements Service\n */\nclass Web3Storage {\n /**\n * Constructs a client bound to the given `options.token` and\n * `options.endpoint`.\n *\n * @example\n * ```js\n * import { Web3Storage } from 'web3.storage'\n * const client = new Web3Storage({ token: API_TOKEN })\n * ```\n *\n * @param {{token: string, endpoint?:URL, rateLimiter?: RateLimiter}} options\n */\n constructor ({\n token,\n endpoint = new URL('https://api.web3.storage'),\n rateLimiter\n }) {\n /**\n * Authorization token.\n *\n * @readonly\n */\n this.token = token\n /**\n * Service API endpoint `URL`.\n * @readonly\n */\n this.endpoint = endpoint\n /**\n * @readonly\n */\n this.rateLimiter = rateLimiter || createRateLimiter()\n }\n\n /**\n * @hidden\n * @param {string} token\n * @returns {Record<string, string>}\n */\n static headers (token) {\n if (!token) throw new Error('missing token')\n return {\n Authorization: `Bearer ${token}`,\n 'X-Client': 'web3.storage/js'\n }\n }\n\n /**\n * @param {Service} service\n * @param {Iterable<Filelike>} files\n * @param {PutOptions} [options]\n * @returns {Promise<CIDString>}\n */\n static async put ({ endpoint, token, rateLimiter = globalRateLimiter }, files, {\n onRootCidReady,\n onStoredChunk,\n maxRetries = MAX_PUT_RETRIES,\n maxChunkSize = DEFAULT_CHUNK_SIZE,\n wrapWithDirectory = true,\n name\n } = {}) {\n if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n }\n const blockstore = new Blockstore()\n try {\n const { out, root } = await pack({\n input: Array.from(files).map(toImportCandidate),\n blockstore,\n wrapWithDirectory,\n maxChunkSize: MAX_BLOCK_SIZE,\n maxChildrenPerNode: 1024\n })\n onRootCidReady && onRootCidReady(root.toString())\n const car = await CarReader.fromIterable(out)\n return await Web3Storage.putCar({ endpoint, token, rateLimiter }, car, { onStoredChunk, maxRetries, maxChunkSize, name })\n } finally {\n await blockstore.close()\n }\n }\n\n /**\n * @param {Service} service\n * @param {import('@ipld/car/api').CarReader} car\n * @param {PutCarOptions} [options]\n * @returns {Promise<CIDString>}\n */\n static async putCar ({ endpoint, token, rateLimiter = globalRateLimiter }, car, {\n name,\n onStoredChunk,\n maxRetries = MAX_PUT_RETRIES,\n maxChunkSize = DEFAULT_CHUNK_SIZE,\n decoders\n } = {}) {\n if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n }\n const targetSize = maxChunkSize\n const url = new URL('car', endpoint)\n let headers = Web3Storage.headers(token)\n\n if (name) {\n headers = { ...headers, 'X-Name': encodeURIComponent(name) }\n }\n\n const roots = await car.getRoots()\n if (roots[0] == null) {\n throw new Error('missing root CID')\n }\n if (roots.length > 1) {\n throw new Error('too many roots')\n }\n\n const carRoot = roots[0].toString()\n const splitter = new TreewalkCarSplitter(car, targetSize, { decoders })\n\n /**\n * @param {AsyncIterable<Uint8Array>} car\n * @returns {Promise<CIDString>}\n */\n const onCarChunk = async car => {\n const carParts = []\n for await (const part of car) {\n carParts.push(part)\n }\n\n const carFile = new Blob(carParts, { type: 'application/car' })\n const res = await pRetry(\n async () => {\n await rateLimiter()\n const request = await fetch(url.toString(), {\n method: 'POST',\n headers,\n body: carFile\n })\n /* c8 ignore next 3 */\n if (request.status === 429) {\n throw new Error('rate limited')\n }\n const res = await request.json()\n if (!request.ok) {\n throw new Error(res.message)\n }\n\n if (res.cid !== carRoot) {\n throw new Error(`root CID mismatch, expected: ${carRoot}, received: ${res.cid}`)\n }\n return res.cid\n },\n { retries: maxRetries }\n )\n\n onStoredChunk && onStoredChunk(carFile.size)\n return res\n }\n\n const upload = transform(MAX_CONCURRENT_UPLOADS, onCarChunk)\n for await (const _ of upload(splitter.cars())) {} // eslint-disable-line\n return carRoot\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<Web3Response | null>}\n */\n static async get ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {\n const url = new URL(`car/${cid}`, endpoint)\n await rateLimiter()\n const res = await fetch(url.toString(), {\n method: 'GET',\n headers: Web3Storage.headers(token)\n })\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n return toWeb3Response(res)\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<CIDString>}\n */\n /* c8 ignore next 4 */\n static async delete ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {\n console.log('Not deleting', cid, endpoint, token, rateLimiter)\n throw Error('.delete not implemented yet')\n }\n\n /**\n * @param {Service} service\n * @param {CIDString} cid\n * @returns {Promise<Status | undefined>}\n */\n static async status ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {\n const url = new URL(`status/${cid}`, endpoint)\n await rateLimiter()\n const res = await fetch(url.toString(), {\n method: 'GET',\n headers: Web3Storage.headers(token)\n })\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n if (res.status === 404) {\n return undefined\n }\n if (!res.ok) {\n throw new Error(res.statusText)\n }\n return res.json()\n }\n\n /**\n * @param {Service} service\n * @param {object} [opts]\n * @param {string} [opts.before] list items uploaded before this ISO 8601 date string\n * @param {number} [opts.maxResults] maximum number of results to return\n * @returns {AsyncIterable<Upload>}\n */\n static async * list (service, { before = new Date().toISOString(), maxResults = Infinity } = {}) {\n /**\n * @param {Service} service\n * @param {{before: string, size: number}} opts\n * @returns {Promise<Response>}\n */\n async function listPage ({ endpoint, token, rateLimiter = globalRateLimiter }, { before, size }) {\n const search = new URLSearchParams({ before, size: size.toString() })\n const url = new URL(`user/uploads?${search}`, endpoint)\n await rateLimiter()\n return fetch(url.toString(), {\n method: 'GET',\n headers: {\n ...Web3Storage.headers(token),\n 'Access-Control-Request-Headers': 'Link'\n }\n })\n }\n let count = 0\n const size = maxResults > 100 ? 100 : maxResults\n for await (const res of paginator(listPage, service, { before, size })) {\n if (!res.ok) {\n /* c8 ignore next 3 */\n if (res.status === 429) {\n throw new Error('rate limited')\n }\n\n /* c8 ignore next 2 */\n const errorMessage = await res.json()\n throw new Error(`${res.status} ${res.statusText} ${errorMessage ? '- ' + errorMessage.message : ''}`)\n }\n const page = await res.json()\n for (const upload of page) {\n if (++count > maxResults) {\n return\n }\n yield upload\n }\n }\n }\n\n // Just a sugar so you don't have to pass around endpoint and token around.\n\n /**\n * Uploads files to web3.storage. Files are hashed in the client and uploaded as a single\n * [Content Addressed Archive(CAR)](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md).\n * Takes a [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob)\n *\n * Returns the corresponding Content Identifier (CID).\n *\n * @example\n * ```js\n * const file = new File(['hello world'], 'hello.txt', { type: 'text/plain' })\n * const cid = await client.put([file])\n * ```\n * @param {Iterable<Filelike>} files\n * @param {PutOptions} [options]\n */\n put (files, options) {\n return Web3Storage.put(this, files, options)\n }\n\n /**\n * Uploads a CAR ([Content Addressed Archive](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md)) file to web3.storage.\n * Takes a CarReader interface from @ipld/car\n *\n * Returns the corresponding Content Identifier (CID).\n *\n * @example\n * ```js\n * import fs from 'fs'\n * import { Readable } from 'stream'\n * import { CarReader, CarWriter } from '@ipld/car'\n * import * as raw from 'multiformats/codecs/raw'\n * import { CID } from 'multiformats/cid'\n * import { sha256 } from 'multiformats/hashes/sha2'\n *\n * async function getCar() {\n * const bytes = new TextEncoder().encode('random meaningless bytes')\n * const hash = await sha256.digest(raw.encode(bytes))\n * const cid = CID.create(1, raw.code, hash)\n *\n * // create the writer and set the header with a single root\n * const { writer, out } = await CarWriter.create([cid])\n * Readable.from(out).pipe(fs.createWriteStream('example.car'))\n\n * // store a new block, creates a new file entry in the CAR archive\n * await writer.put({ cid, bytes })\n * await writer.close()\n\n * const inStream = fs.createReadStream('example.car')\n * // read and parse the entire stream in one go, this will cache the contents of\n * // the car in memory so is not suitable for large files.\n * const reader = await CarReader.fromIterable(inStream)\n * return reader\n * }\n *\n * const car = await getCar()\n * const cid = await client.putCar(car)\n * ```\n * @param {import('@ipld/car/api').CarReader} car\n * @param {PutCarOptions} [options]\n */\n putCar (car, options) {\n return Web3Storage.putCar(this, car, options)\n }\n\n /**\n * Fetch the Content Addressed Archive by its root CID.\n * @param {CIDString} cid\n */\n get (cid) {\n return Web3Storage.get(this, cid)\n }\n\n /**\n * @param {CIDString} cid\n */\n /* c8 ignore next 3 */\n delete (cid) {\n return Web3Storage.delete(this, cid)\n }\n\n /**\n * Fetch info on Filecoin deals and IPFS pins that a given CID is replicated in.\n * @param {CIDString} cid\n */\n status (cid) {\n return Web3Storage.status(this, cid)\n }\n\n /**\n * Find all uploads for this account. Use a `for await...of` loop to fetch them all.\n * @example\n * Fetch all the uploads\n * ```js\n * const uploads = []\n * for await (const item of client.list()) {\n * uploads.push(item)\n * }\n * ```\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of\n * @param {object} [opts]\n * @param {string} [opts.before] list items uploaded before this ISO 8601 date string\n * @param {number} [opts.maxResults] maximum number of results to return\n * @returns {AsyncIterable<Upload>}\n */\n list (opts) {\n return Web3Storage.list(this, opts)\n }\n}\n\n/**\n * Map a UnixFSEntry to a File with a cid property\n * @param {UnixFSEntry} entry\n * @returns {Promise<Web3File>}\n */\nasync function toWeb3File ({ content, path, cid }) {\n const chunks = []\n for await (const chunk of content()) {\n chunks.push(chunk)\n }\n const file = new File(chunks, toFilenameWithPath(path))\n return Object.assign(file, { cid: cid.toString() })\n}\n\n/**\n * Trim the root cid from the path if there is anyting after it.\n * bafy...ic2q/path/to/pinpie.jpg => path/to/pinpie.jpg\n * bafy...ic2q/pinpie.jpg => pinpie.jpg\n * bafk...52zy => bafk...52zy\n * @param {string} unixFsPath\n * @returns {string}\n */\nfunction toFilenameWithPath (unixFsPath) {\n const slashIndex = unixFsPath.indexOf('/')\n return slashIndex === -1 ? unixFsPath : unixFsPath.substring(slashIndex + 1)\n}\n\n/**\n * Add car unpacking smarts to the response object,\n * @param {Response} res\n * @returns {Web3Response}\n */\nfunction toWeb3Response (res) {\n const response = Object.assign(res, {\n unixFsIterator: async function * () {\n if (!res.ok) {\n throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .unixFsIterator`)\n }\n /* c8 ignore next 3 */\n if (!res.body) {\n throw new Error('No body on response')\n }\n const blockstore = new Blockstore()\n try {\n for await (const entry of unpackStream(res.body, { blockstore })) {\n yield entry\n }\n } finally {\n await blockstore.close()\n }\n },\n files: async () => {\n if (!res.ok) {\n throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .files`)\n }\n const files = []\n // @ts-ignore we're using the enriched response here\n for await (const entry of response.unixFsIterator()) {\n if (entry.type === 'directory') {\n continue\n }\n const file = await toWeb3File(entry)\n files.push(file)\n }\n return files\n }\n })\n return response\n}\n\n/**\n * Convert the passed file to an \"import candidate\" - an object suitable for\n * passing to the ipfs-unixfs-importer. Note: content is an accessor so that\n * the stream is only created when needed.\n *\n * @param {Filelike} file\n */\nfunction toImportCandidate (file) {\n /** @type {ReadableStream} */\n let stream\n return {\n path: file.name,\n get content () {\n stream = stream || file.stream()\n return stream\n }\n }\n}\n\n/**\n * Follow Link headers on a Response, to fetch all the things.\n *\n * @param {(service: Service, opts: any) => Promise<Response>} fn\n * @param {Service} service\n * @param {{}} opts\n */\nasync function * paginator (fn, service, opts) {\n let res = await fn(service, opts)\n yield res\n let link = parseLinkHeader(res.headers.get('Link') || '')\n // @ts-ignore\n while (link && link.next) {\n // @ts-ignore\n res = await fn(service, link.next)\n yield res\n link = parseLinkHeader(res.headers.get('Link') || '')\n }\n}\n\nexport { Web3Storage, File, Blob, filesFromPath, getFilesFromPath }\n\n/**\n * Just to verify API compatibility.\n * TODO: convert lib to a regular class that can be type checked.\n * @type {API}\n */\nconst api = Web3Storage\nvoid api // eslint-disable-line no-void\n"],"names":["throttledQueue","Blockstore","pack","car","CarReader","TreewalkCarSplitter","Blob","pRetry","fetch","transform","file","File","unpackStream","parseLinkHeader"],"mappings":"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"}

@@ -1,12 +0,1 @@

export type API = import('./lib/interface.js').API;
export type Status = import('./lib/interface.js').Status;
export type Upload = import('./lib/interface.js').Upload;
export type Service = import('./lib/interface.js').Service;
export type Web3File = import('./lib/interface.js').Web3File;
export type Filelike = import('./lib/interface.js').Filelike;
export type CIDString = import('./lib/interface.js').CIDString;
export type PutOptions = import('./lib/interface.js').PutOptions;
export type PutCarOptions = import('./lib/interface.js').PutCarOptions;
export type UnixFSEntry = import('./lib/interface.js').UnixFSEntry;
export type Web3Response = import('./lib/interface.js').Web3Response;
/** @typedef { import('./lib/interface.js').API } API */

@@ -21,5 +10,25 @@ /** @typedef { import('./lib/interface.js').Status} Status */

/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */
/** @typedef { import('./lib/interface.js').RateLimiter } RateLimiter */
/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */
/** @typedef { import('./lib/interface.js').Web3Response} Web3Response */
/**
* Creates a rate limiter which limits at the same rate as is enforced
* server-side, to allow the client to avoid exceeding the requests limit and
* being blocked for 30 seconds.
* @returns {RateLimiter}
*/
export function createRateLimiter(): RateLimiter;
export type API = import('./lib/interface.js').API;
export type Status = import('./lib/interface.js').Status;
export type Upload = import('./lib/interface.js').Upload;
export type Service = import('./lib/interface.js').Service;
export type Web3File = import('./lib/interface.js').Web3File;
export type Filelike = import('./lib/interface.js').Filelike;
export type CIDString = import('./lib/interface.js').CIDString;
export type PutOptions = import('./lib/interface.js').PutOptions;
export type PutCarOptions = import('./lib/interface.js').PutCarOptions;
export type RateLimiter = import('./lib/interface.js').RateLimiter;
export type UnixFSEntry = import('./lib/interface.js').UnixFSEntry;
export type Web3Response = import('./lib/interface.js').Web3Response;
/**
* @implements Service

@@ -40,3 +49,3 @@ */

*/
static put({ endpoint, token }: Service, files: Iterable<Filelike>, { onRootCidReady, onStoredChunk, maxRetries, maxChunkSize, wrapWithDirectory, name }?: import("./lib/interface.js").PutOptions | undefined): Promise<CIDString>;
static put({ endpoint, token, rateLimiter }: Service, files: Iterable<Filelike>, { onRootCidReady, onStoredChunk, maxRetries, maxChunkSize, wrapWithDirectory, name }?: import("./lib/interface.js").PutOptions | undefined): Promise<CIDString>;
/**

@@ -48,3 +57,3 @@ * @param {Service} service

*/
static putCar({ endpoint, token }: Service, car: import('@ipld/car/api').CarReader, { name, onStoredChunk, maxRetries, maxChunkSize, decoders }?: import("./lib/interface.js").PutCarOptions | undefined): Promise<CIDString>;
static putCar({ endpoint, token, rateLimiter }: Service, car: import('@ipld/car/api').CarReader, { name, onStoredChunk, maxRetries, maxChunkSize, decoders }?: import("./lib/interface.js").PutCarOptions | undefined): Promise<CIDString>;
/**

@@ -55,3 +64,3 @@ * @param {Service} service

*/
static get({ endpoint, token }: Service, cid: CIDString): Promise<Web3Response | null>;
static get({ endpoint, token, rateLimiter }: Service, cid: CIDString): Promise<Web3Response | null>;
/**

@@ -62,3 +71,3 @@ * @param {Service} service

*/
static delete({ endpoint, token }: Service, cid: CIDString): Promise<CIDString>;
static delete({ endpoint, token, rateLimiter }: Service, cid: CIDString): Promise<CIDString>;
/**

@@ -69,3 +78,3 @@ * @param {Service} service

*/
static status({ endpoint, token }: Service, cid: CIDString): Promise<Status | undefined>;
static status({ endpoint, token, rateLimiter }: Service, cid: CIDString): Promise<Status | undefined>;
/**

@@ -92,7 +101,8 @@ * @param {Service} service

*
* @param {{token: string, endpoint?:URL}} options
* @param {{token: string, endpoint?:URL, rateLimiter?: RateLimiter}} options
*/
constructor({ token, endpoint }: {
constructor({ token, endpoint, rateLimiter }: {
token: string;
endpoint?: URL;
rateLimiter?: RateLimiter;
});

@@ -111,2 +121,6 @@ /**

/**
* @readonly
*/
readonly rateLimiter: import("./lib/interface.js").RateLimiter;
/**
* Uploads files to web3.storage. Files are hashed in the client and uploaded as a single

@@ -113,0 +127,0 @@ * [Content Addressed Archive(CAR)](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md).

@@ -1,1 +0,1 @@

{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.js"],"names":[],"mappings":"kBAoCe,OAAO,oBAAoB,EAAE,GAAG;qBAChC,OAAO,oBAAoB,EAAE,MAAM;qBACnC,OAAO,oBAAoB,EAAE,MAAM;sBACnC,OAAO,oBAAoB,EAAE,OAAO;uBACpC,OAAO,oBAAoB,EAAE,QAAQ;uBACrC,OAAO,oBAAoB,EAAE,QAAQ;wBACrC,OAAO,oBAAoB,EAAE,SAAS;yBACtC,OAAO,oBAAoB,EAAE,UAAU;4BACvC,OAAO,oBAAoB,EAAE,aAAa;0BAC1C,OAAO,oBAAoB,EAAE,WAAW;2BACxC,OAAO,oBAAoB,EAAE,YAAY;AAVxD,wDAAwD;AACxD,6DAA6D;AAC7D,6DAA6D;AAC7D,gEAAgE;AAChE,iEAAiE;AACjE,kEAAkE;AAClE,mEAAmE;AACnE,qEAAqE;AACrE,2EAA2E;AAC3E,uEAAuE;AACvE,yEAAyE;AAEzE;;GAEG;AACH;IA2BE;;;;OAIG;IACH,sBAHW,MAAM,GACJ,OAAO,MAAM,EAAE,MAAM,CAAC,CAQlC;IAED;;;;;OAKG;IACH,gCALW,OAAO,SACP,SAAS,QAAQ,CAAC,+IAEhB,QAAQ,SAAS,CAAC,CA4B9B;IAED;;;;;OAKG;IACH,mCALW,OAAO,OACP,OAAO,eAAe,EAAE,SAAS,yHAE/B,QAAQ,SAAS,CAAC,CAyE9B;IAED;;;;OAIG;IACH,gCAJW,OAAO,OACP,SAAS,GACP,QAAQ,YAAY,GAAG,IAAI,CAAC,CAaxC;IAED;;;;OAIG;IAEH,mCALW,OAAO,OACP,SAAS,GACP,QAAQ,SAAS,CAAC,CAM9B;IAED;;;;OAIG;IACH,mCAJW,OAAO,OACP,SAAS,GACP,QAAQ,MAAM,GAAG,SAAS,CAAC,CAmBvC;IAED;;;;;;OAMG;IACH,qBANW,OAAO;;;oBAIL,cAAc,MAAM,CAAC,CAwCjC;IA1PD;;;;;;;;;;;OAWG;IACH,iCAFW;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,GAAG,CAAA;KAAC,EAcxC;IAXC;;;;OAIG;IACH,uBAAkB;IAClB;;;OAGG;IACH,uBAAwB;IAuO1B;;;;;;;;;;;;;;OAcG;IACH,WAHW,SAAS,QAAQ,CAAC,kHAK5B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACH,YAHW,OAAO,eAAe,EAAE,SAAS,qHAK3C;IAED;;;OAGG;IACH,SAFW,SAAS,6DAInB;IAED;;OAEG;IAEH,YAHW,SAAS,mDAKnB;IAED;;;OAGG;IACH,YAFW,SAAS,4DAInB;IAED;;;;;;;;;;;;;;;OAeG;IACH;;;oBAFa,cAAc,MAAM,CAAC,CAIjC;CACF"}
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.js"],"names":[],"mappings":"AAwCA,wDAAwD;AACxD,6DAA6D;AAC7D,6DAA6D;AAC7D,gEAAgE;AAChE,iEAAiE;AACjE,kEAAkE;AAClE,mEAAmE;AACnE,qEAAqE;AACrE,2EAA2E;AAC3E,wEAAwE;AACxE,uEAAuE;AACvE,yEAAyE;AAEzE;;;;;GAKG;AACH,qCAFa,WAAW,CAKvB;kBAtBc,OAAO,oBAAoB,EAAE,GAAG;qBAChC,OAAO,oBAAoB,EAAE,MAAM;qBACnC,OAAO,oBAAoB,EAAE,MAAM;sBACnC,OAAO,oBAAoB,EAAE,OAAO;uBACpC,OAAO,oBAAoB,EAAE,QAAQ;uBACrC,OAAO,oBAAoB,EAAE,QAAQ;wBACrC,OAAO,oBAAoB,EAAE,SAAS;yBACtC,OAAO,oBAAoB,EAAE,UAAU;4BACvC,OAAO,oBAAoB,EAAE,aAAa;0BAC1C,OAAO,oBAAoB,EAAE,WAAW;0BACxC,OAAO,oBAAoB,EAAE,WAAW;2BACxC,OAAO,oBAAoB,EAAE,YAAY;AAoBxD;;GAEG;AACH;IAmCE;;;;OAIG;IACH,sBAHW,MAAM,GACJ,OAAO,MAAM,EAAE,MAAM,CAAC,CAQlC;IAED;;;;;OAKG;IACH,6CALW,OAAO,SACP,SAAS,QAAQ,CAAC,+IAEhB,QAAQ,SAAS,CAAC,CA4B9B;IAED;;;;;OAKG;IACH,gDALW,OAAO,OACP,OAAO,eAAe,EAAE,SAAS,yHAE/B,QAAQ,SAAS,CAAC,CA0E9B;IAED;;;;OAIG;IACH,6CAJW,OAAO,OACP,SAAS,GACP,QAAQ,YAAY,GAAG,IAAI,CAAC,CAcxC;IAED;;;;OAIG;IAEH,gDALW,OAAO,OACP,SAAS,GACP,QAAQ,SAAS,CAAC,CAM9B;IAED;;;;OAIG;IACH,gDAJW,OAAO,OACP,SAAS,GACP,QAAQ,MAAM,GAAG,SAAS,CAAC,CAoBvC;IAED;;;;;;OAMG;IACH,qBANW,OAAO;;;oBAIL,cAAc,MAAM,CAAC,CAyCjC;IAtQD;;;;;;;;;;;OAWG;IACH,8CAFW;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,GAAG,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAC,EAsBnE;IAfC;;;;OAIG;IACH,uBAAkB;IAClB;;;OAGG;IACH,uBAAwB;IACxB;;OAEG;IACH,+DAAqD;IA2OvD;;;;;;;;;;;;;;OAcG;IACH,WAHW,SAAS,QAAQ,CAAC,kHAK5B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACH,YAHW,OAAO,eAAe,EAAE,SAAS,qHAK3C;IAED;;;OAGG;IACH,SAFW,SAAS,6DAInB;IAED;;OAEG;IAEH,YAHW,SAAS,mDAKnB;IAED;;;OAGG;IACH,YAFW,SAAS,4DAInB;IAED;;;;;;;;;;;;;;;OAeG;IACH;;;oBAFa,cAAc,MAAM,CAAC,CAIjC;CACF"}

@@ -15,5 +15,7 @@ import type { UnixFSEntry } from 'ipfs-car/unpack';

token: string;
rateLimiter?: RateLimiter;
}
export interface PublicService {
endpoint: URL;
rateLimiter?: RateLimiter;
}

@@ -237,2 +239,9 @@ /**

}
/**
* RateLimiter returns a promise that resolves when it is safe to send a request
* that does not exceed the rate limit.
*/
export interface RateLimiter {
(): Promise<void>;
}
//# sourceMappingURL=interface.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interface.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interface.ts"],"names":[],"mappings":"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"}
{
"name": "web3.storage",
"version": "4.0.0",
"version": "4.1.0",
"description": "API client for web3.storage",

@@ -47,2 +47,3 @@ "type": "module",

"streaming-iterables": "^6.2.0",
"throttled-queue": "^2.1.2",
"uint8arrays": "^3.0.0"

@@ -49,0 +50,0 @@ },

@@ -24,2 +24,3 @@ /**

import { filesFromPath, getFilesFromPath } from 'files-from-path'
import throttledQueue from 'throttled-queue'
import {

@@ -37,2 +38,5 @@ fetch,

const MAX_CHUNK_SIZE = 104857600
// These match what is enforced server-side
const RATE_LIMIT_REQUESTS = 30
const RATE_LIMIT_PERIOD = 10 * 1000

@@ -48,2 +52,3 @@ /** @typedef { import('./lib/interface.js').API } API */

/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */
/** @typedef { import('./lib/interface.js').RateLimiter } RateLimiter */
/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */

@@ -53,2 +58,20 @@ /** @typedef { import('./lib/interface.js').Web3Response} Web3Response */

/**
* Creates a rate limiter which limits at the same rate as is enforced
* server-side, to allow the client to avoid exceeding the requests limit and
* being blocked for 30 seconds.
* @returns {RateLimiter}
*/
export function createRateLimiter () {
const throttle = throttledQueue(RATE_LIMIT_REQUESTS, RATE_LIMIT_PERIOD)
return () => throttle(() => {})
}
/**
* Rate limiter used by static API if no rate limiter is passed. Note that each
* instance of the Web3Storage class gets it's own limiter if none is passed.
* This is because rate limits are enforced per API token.
*/
const globalRateLimiter = createRateLimiter()
/**
* @implements Service

@@ -67,5 +90,9 @@ */

*
* @param {{token: string, endpoint?:URL}} options
* @param {{token: string, endpoint?:URL, rateLimiter?: RateLimiter}} options
*/
constructor ({ token, endpoint = new URL('https://api.web3.storage') }) {
constructor ({
token,
endpoint = new URL('https://api.web3.storage'),
rateLimiter
}) {
/**

@@ -82,2 +109,6 @@ * Authorization token.

this.endpoint = endpoint
/**
* @readonly
*/
this.rateLimiter = rateLimiter || createRateLimiter()
}

@@ -104,3 +135,3 @@

*/
static async put ({ endpoint, token }, files, {
static async put ({ endpoint, token, rateLimiter = globalRateLimiter }, files, {
onRootCidReady,

@@ -127,3 +158,3 @@ onStoredChunk,

const car = await CarReader.fromIterable(out)
return await Web3Storage.putCar({ endpoint, token }, car, { onStoredChunk, maxRetries, maxChunkSize, name })
return await Web3Storage.putCar({ endpoint, token, rateLimiter }, car, { onStoredChunk, maxRetries, maxChunkSize, name })
} finally {

@@ -140,3 +171,3 @@ await blockstore.close()

*/
static async putCar ({ endpoint, token }, car, {
static async putCar ({ endpoint, token, rateLimiter = globalRateLimiter }, car, {
name,

@@ -183,2 +214,3 @@ onStoredChunk,

async () => {
await rateLimiter()
const request = await fetch(url.toString(), {

@@ -220,4 +252,5 @@ method: 'POST',

*/
static async get ({ endpoint, token }, cid) {
static async get ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
const url = new URL(`car/${cid}`, endpoint)
await rateLimiter()
const res = await fetch(url.toString(), {

@@ -240,4 +273,4 @@ method: 'GET',

/* c8 ignore next 4 */
static async delete ({ endpoint, token }, cid) {
console.log('Not deleting', cid, endpoint, token)
static async delete ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
console.log('Not deleting', cid, endpoint, token, rateLimiter)
throw Error('.delete not implemented yet')

@@ -251,4 +284,5 @@ }

*/
static async status ({ endpoint, token }, cid) {
static async status ({ endpoint, token, rateLimiter = globalRateLimiter }, cid) {
const url = new URL(`status/${cid}`, endpoint)
await rateLimiter()
const res = await fetch(url.toString(), {

@@ -284,5 +318,6 @@ method: 'GET',

*/
function listPage ({ endpoint, token }, { before, size }) {
async function listPage ({ endpoint, token, rateLimiter = globalRateLimiter }, { before, size }) {
const search = new URLSearchParams({ before, size: size.toString() })
const url = new URL(`user/uploads?${search}`, endpoint)
await rateLimiter()
return fetch(url.toString(), {

@@ -289,0 +324,0 @@ method: 'GET',

@@ -15,2 +15,3 @@ import type { UnixFSEntry } from 'ipfs-car/unpack'

token: string
rateLimiter?: RateLimiter
}

@@ -20,2 +21,3 @@

endpoint: URL
rateLimiter?: RateLimiter
}

@@ -260,1 +262,9 @@

}
/**
* RateLimiter returns a promise that resolves when it is safe to send a request
* that does not exceed the rate limit.
*/
export interface RateLimiter {
(): Promise<void>
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet