001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2025-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.cas; 019 020import com.google.common.io.ByteSource; 021 022import io.ipfs.cid.Cid; 023 024import java.io.IOException; 025 026/** 027 * BlobStore stores bytes, which can then be loaded again given their CID. 028 * 029 * <p>This interface could be implemented with: 030 * 031 * <ul> 032 * <li>just with simple non-distributed local files 033 * <li>Or into a Key Value Store 034 * <li>with <a href="https://github.com/systemd/casync/">systemd casync</a> 035 * <li>on <a href="https://ipfs.tech/">IPFS</a> in <a 036 * href="https://ipld.io/specs/transport/car/">CAR files</a> 037 * <li>on IPFS, distributed (with <a href="https://docs.ipfs.tech/install/command-line/">IPFS 038 * Bitswap with Kubo</a> (or <a href="https://github.com/Peergos/nabu">Nabu</a>) 039 * <li>on the <a href="https://iroh.network/">Iroh Network</a> based on <a 040 * href="https://www.iroh.computer/">Iroh</a> by <a href="https://n0.computer/">number0</a> 041 * <li>something else, maybe based on Consensus with Raft or Paxos. 042 * </ul> 043 */ 044public interface BlobStore { 045 046 Cid store(ByteSource source) throws IOException; 047 048 ByteSource load(Cid cid) throws IOException; 049 050 // TODO void delete(Cid cid) 051}