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}