{"id":46864,"library":"abstract-blob-store","title":"abstract-blob-store","description":"abstract-blob-store defines a de-facto standard streaming file storage/retrieval interface for Node.js, inspired by abstract-leveldown. At version 3.3.5, it provides a reusable test suite and API contract that multiple storage backends (local, S3, Google Cloud, IPFS, Azure, etc.) implement consistently. Key differentiators: enforces a uniform streaming API for createWriteStream/createReadStream/exists/remove operations; ships TypeScript types; decouples implementation from testing via a shared test module. Currently unmaintained since 2019, but widely depended upon across the blob store ecosystem.","status":"maintenance","version":"3.3.5","language":"javascript","source_language":"en","source_url":"https://github.com/maxogden/abstract-blob-store","tags":["javascript","hyperdata","dat","typescript"],"install":[{"cmd":"npm install abstract-blob-store","lang":"bash","label":"npm"},{"cmd":"yarn add abstract-blob-store","lang":"bash","label":"yarn"},{"cmd":"pnpm add abstract-blob-store","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"The main export is the API interface, but the test suite is under '/tests' subpath. Both ESM and CJS are supported.","wrong":"const tests = require('abstract-blob-store')","symbol":"tests","correct":"import tests from 'abstract-blob-store/tests'"},{"note":"Default export is the function to create a store instance; named exports are not available.","wrong":"import { blobStore } from 'abstract-blob-store'","symbol":"API interface","correct":"import blobStore from 'abstract-blob-store'; const store = blobStore()"},{"note":"Type-only import for TypeScript users; the interface is not a runtime value.","wrong":"import { BlobStore } from 'abstract-blob-store'","symbol":"BlobStore type","correct":"import type { BlobStore } from 'abstract-blob-store'"}],"quickstart":{"code":"import test from 'tape';\nimport tests from 'abstract-blob-store/tests';\n\nexport default function createMyBlobStore() {\n  return {\n    createWriteStream: (opts, cb) => {\n      // ...\n    },\n    createReadStream: (opts) => {\n      // ...\n    },\n    exists: (opts, cb) => {\n      // ...\n    },\n    remove: (opts, cb) => {\n      // ...\n    }\n  };\n}\n\nconst common = {\n  setup: (t, cb) => {\n    const store = createMyBlobStore();\n    cb(null, store);\n  },\n  teardown: (t, store, blob, cb) => {\n    if (blob) store.remove(blob, cb);\n    else cb();\n  }\n};\n\ntests(test, common);","lang":"typescript","description":"Shows how to implement a custom blob store and run it against the abstract test suite using tape."},"warnings":[{"fix":"Use tape (npm install tape) and run with node test.js instead of jest.","message":"The test suite expects tape or tap-compatible test framework; using jest or mocha may cause failures.","severity":"gotcha","affected_versions":">=1.0"},{"fix":"Consider alternatives like abstract-leveldown for new projects, or fork if needed.","message":"Package is effectively unmaintained since 2019; no new releases or bugfixes expected.","severity":"deprecated","affected_versions":"3.x"},{"fix":"Always check the callback for blob metadata rather than relying on stream events.","message":"createWriteStream does not return a writable stream in all implementations; API is callback-based for metadata.","severity":"gotcha","affected_versions":">=1.0"},{"fix":"Upgrade to 3.x or pin to 2.x for Node 8/9 compatibility.","message":"Version 3.0 dropped support for Node.js < 10; older versions use callbacks differently.","severity":"breaking","affected_versions":"<3.0"}],"env_vars":null,"search_vec":"'2019':76 '3.3.5':28 'abstract':2,6,24 'abstract-blob-stor':1,5 'abstract-leveldown':23 'across':81 'api':36,57 'azur':47 'backend':41 'blob':3,7,83 'cloud':45 'consist':50 'contract':37 'createwritestream/createreadstream/exists/remove':59 'current':73 'dat':88 'de':12 'de-facto':11 'decoupl':64 'defin':9 'depend':79 'differenti':52 'ecosystem':85 'enforc':53 'etc':48 'facto':13 'file':16 'googl':44 'hyperdata':87 'implement':49,65 'inspir':21 'interfac':18 'ipf':46 'javascript':86 'key':51 'leveldown':25 'local':42 'modul':72 'multipl':39 'node.js':20 'oper':60 'provid':30 'reusabl':32 's3':43 'share':70 'ship':61 'sinc':75 'standard':14 'storag':40 'storage/retrieval':17 'store':4,8,84 'stream':15,56 'suit':34 'test':33,67,71 'type':63 'typescript':62,89 'uniform':55 'unmaintain':74 'upon':80 'version':27 'via':68 'wide':78","created_at":"2026-06-07T16:47:58.326843+00:00","updated_at":"2026-06-07T16:47:58.326843+00:00","problems":[{"fix":"Ensure your store object has createWriteStream method; if using the abstract module, it exports a factory, not a ready-to-use store.","cause":"Importing the main module instead of implementing the API in your store object.","error":"TypeError: createWriteStream is not a function"},{"fix":"Upgrade to >=3.0.0 and use require('abstract-blob-store/tests') instead of require('abstract-blob-store/test')","cause":"Using an old version (pre-3.0) where the test path was different.","error":"Error: Cannot find module 'abstract-blob-store/tests'"},{"fix":"Define common.setup and common.teardown as functions that take (t, cb) and (t, store, blob, cb) respectively.","cause":"Passing an object with missing or incorrectly named common methods.","error":"TypeError: common.setup is not a function"},{"fix":"Ensure exists passes 'true' or 'false' (as boolean) in the callback: cb(null, true) if blob exists.","cause":"exists callback returns a boolean but implementation returns undefined.","error":"AssertionError: Expected true, got false"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/maxogden/abstract-blob-store","github":"https://github.com/maxogden/abstract-blob-store","docs":null,"changelog":null,"pypi":null,"npm":"abstract-blob-store","openapi_spec":null,"status_page":null,"smithery":null,"categories":["storage"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-07","next_check":"2026-09-05","install_tag":null}}