feat: initial MemoriC project — spec, plan, POC (broker, agent, Android app)

This commit is contained in:
2026-05-13 16:06:58 +08:00
commit c083f89c66
150 changed files with 5891 additions and 0 deletions

5
poc/agent/go.mod Normal file
View File

@@ -0,0 +1,5 @@
module clouderized-memories-agent
go 1.21
require github.com/gorilla/websocket v1.5.3

2
poc/agent/go.sum Normal file
View File

@@ -0,0 +1,2 @@
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=

84
poc/agent/main.go Normal file
View File

@@ -0,0 +1,84 @@
package main
import (
"encoding/base64"
"encoding/json"
"log"
"os"
"path/filepath"
"github.com/gorilla/websocket"
)
const brokerURL = "wss://memory.clouderized.com/agent"
const storageDir = "./photos"
type Message struct {
Type string `json:"type"`
Filename string `json:"filename,omitempty"`
Data string `json:"data,omitempty"`
RequestID string `json:"request_id,omitempty"`
Error string `json:"error,omitempty"`
}
func main() {
if err := os.MkdirAll(storageDir, 0755); err != nil {
log.Fatal(err)
}
conn, _, err := websocket.DefaultDialer.Dial(brokerURL, nil)
if err != nil {
log.Fatal("connect:", err)
}
defer conn.Close()
log.Println("connected to broker at", brokerURL)
for {
_, raw, err := conn.ReadMessage()
if err != nil {
log.Fatal("read:", err)
}
var msg Message
if err := json.Unmarshal(raw, &msg); err != nil {
log.Println("bad message:", err)
continue
}
switch msg.Type {
case "upload":
data, err := base64.StdEncoding.DecodeString(msg.Data)
if err != nil {
log.Println("decode error:", err)
continue
}
path := filepath.Join(storageDir, msg.Filename)
if err := os.WriteFile(path, data, 0644); err != nil {
log.Println("write error:", err)
continue
}
log.Printf("saved %s (%d bytes)", msg.Filename, len(data))
case "fetch":
path := filepath.Join(storageDir, msg.Filename)
data, err := os.ReadFile(path)
if err != nil {
log.Printf("fetch %s: not found", msg.Filename)
resp, _ := json.Marshal(Message{
Type: "fetch_response",
RequestID: msg.RequestID,
Error: "not found",
})
conn.WriteMessage(websocket.TextMessage, resp)
continue
}
resp, _ := json.Marshal(Message{
Type: "fetch_response",
RequestID: msg.RequestID,
Data: base64.StdEncoding.EncodeToString(data),
})
conn.WriteMessage(websocket.TextMessage, resp)
log.Printf("served %s (%d bytes)", msg.Filename, len(data))
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB