feat: initial MemoriC project — spec, plan, POC (broker, agent, Android app)
This commit is contained in:
5
poc/agent/go.mod
Normal file
5
poc/agent/go.mod
Normal 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
2
poc/agent/go.sum
Normal 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
84
poc/agent/main.go
Normal 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))
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
poc/agent/photos/1000211135.jpg
Normal file
BIN
poc/agent/photos/1000211135.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 MiB |
Reference in New Issue
Block a user