Move chunk/master data structures into libs
diff --git a/chunk/chunk.go b/chunk/chunk.go
deleted file mode 100644
index 1dde057..0000000
--- a/chunk/chunk.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package main
-
-import "context"
-import "flag"
-import "fmt"
-import "log"
-import "net"
-import "time"
-
-import "google.golang.org/grpc"
-
-import pc "pcloud"
-
-var masterAddress string
-var selfAddress string
-
-func init() {
-	flag.StringVar(&masterAddress, "master", "localhost:123", "Metadata storage address.")
-	flag.StringVar(&selfAddress, "self", "", "Metadata storage address.")
-}
-
-type chunkStorage struct {
-}
-
-func (s *chunkStorage) ListChunks(
-	ctx context.Context,
-	request *pc.ListChunksRequest) (*pc.ListChunksResponse, error) {
-	return nil, nil
-}
-
-func (s *chunkStorage) ReadChunk(
-	ctx context.Context,
-	request *pc.ReadChunkRequest) (*pc.ReadChunkResponse, error) {
-	return nil, nil
-}
-
-func (s *chunkStorage) StoreChunk(
-	ctx context.Context,
-	request *pc.StoreChunkRequest) (*pc.StoreChunkResponse, error) {
-	return nil, nil
-}
-
-func main() {
-	flag.Parse()
-	log.Print("Chunk server starting")
-
-	// Create Master server client.
-	var opts []grpc.DialOption
-	opts = append(opts, grpc.WithInsecure())
-	opts = append(opts, grpc.WithBlock())
-	conn, err := grpc.Dial(masterAddress, opts...)
-	if err != nil {
-		log.Fatalf("Failed to dial %s: %v", masterAddress, err)
-	}
-	defer conn.Close()
-	client := pc.NewMetadataStorageClient(conn)
-
-	// Register current Chunk server with Master.
-	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
-	_, err = client.AddChunkServer(
-		ctx,
-		&pc.AddChunkServerRequest{Address: selfAddress})
-	if err != nil {
-		log.Fatalf("failed to register chunk server: %v", err)
-	}
-	log.Print("Registered myself")
-
-	// Start RPC server
-	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 234))
-	if err != nil {
-		log.Fatalf("failed to listen: %v", err)
-	}
-	server := grpc.NewServer()
-	pc.RegisterChunkStorageServer(server, &chunkStorage{})
-	server.Serve(lis)
-}
diff --git a/chunk/server.go b/chunk/server.go
new file mode 100644
index 0000000..c35d761
--- /dev/null
+++ b/chunk/server.go
@@ -0,0 +1,41 @@
+package chunk
+
+import "context"
+import "sync"
+
+import "pcloud/api"
+
+type ChunkServer struct {
+	chunks sync.Map
+}
+
+func NewChunkServer() *ChunkServer {
+	return &ChunkServer{}
+}
+
+func (s *ChunkServer) ListChunks(
+	ctx context.Context,
+	request *api.ListChunksRequest) (*api.ListChunksResponse, error) {
+	resp := api.ListChunksResponse{}
+	s.chunks.Range(func(k, v interface{}) bool {
+		resp.ChunkId = append(resp.ChunkId, k.(string))
+		return true
+	})
+	return &resp, nil
+}
+
+func (s *ChunkServer) ReadChunk(
+	ctx context.Context,
+	request *api.ReadChunkRequest) (*api.ReadChunkResponse, error) {
+	if data, ok := s.chunks.Load(request.ChunkId); ok {
+		return &api.ReadChunkResponse{Data: data.([]byte)}, nil
+	}
+	return nil, nil
+}
+
+func (s *ChunkServer) StoreChunk(
+	ctx context.Context,
+	request *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
+	s.chunks.Store(request.ChunkId, request.Data)
+	return &api.StoreChunkResponse{}, nil
+}