network/pkg/serverless/registry/ipfs_store.go
2026-01-20 10:03:55 +02:00

58 lines
1.4 KiB
Go

package registry
import (
"bytes"
"context"
"fmt"
"io"
"github.com/DeBrosOfficial/network/pkg/ipfs"
"go.uber.org/zap"
)
// IPFSStore handles IPFS storage operations for WASM bytecode.
type IPFSStore struct {
ipfs ipfs.IPFSClient
ipfsAPIURL string
logger *zap.Logger
}
// NewIPFSStore creates a new IPFS store.
func NewIPFSStore(ipfsClient ipfs.IPFSClient, ipfsAPIURL string, logger *zap.Logger) *IPFSStore {
return &IPFSStore{
ipfs: ipfsClient,
ipfsAPIURL: ipfsAPIURL,
logger: logger,
}
}
// Upload uploads WASM bytecode to IPFS and returns the CID.
func (s *IPFSStore) Upload(ctx context.Context, wasmBytes []byte, name string) (string, error) {
reader := bytes.NewReader(wasmBytes)
resp, err := s.ipfs.Add(ctx, reader, name+".wasm")
if err != nil {
return "", fmt.Errorf("failed to upload WASM to IPFS: %w", err)
}
return resp.Cid, nil
}
// Get retrieves WASM bytecode from IPFS by CID.
func (s *IPFSStore) Get(ctx context.Context, wasmCID string) ([]byte, error) {
if wasmCID == "" {
return nil, fmt.Errorf("wasmCID cannot be empty")
}
reader, err := s.ipfs.Get(ctx, wasmCID, s.ipfsAPIURL)
if err != nil {
return nil, fmt.Errorf("failed to get WASM from IPFS: %w", err)
}
defer reader.Close()
data, err := io.ReadAll(reader)
if err != nil {
return nil, fmt.Errorf("failed to read WASM data: %w", err)
}
return data, nil
}