/
w3up.go
98 lines (82 loc) · 2.51 KB
/
w3up.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package w3up
import (
"encoding/json"
"fmt"
"log"
"os"
"os/exec"
"strings"
"github.com/ipfs/go-cid"
"github.com/web3-storage/go-ucanto/did"
)
type W3up struct {
principal string
agentDid did.DID
delegationProofPath string
w3up_dir string
}
func NewW3up(principal string, did did.DID, delegationProofPath string) *W3up {
tmpDir, err := os.MkdirTemp("", "w3up_config")
if err != nil {
log.Fatal("error creating temp dir for w3up config: ", err)
}
return &W3up{principal: principal, agentDid: did, delegationProofPath: delegationProofPath, w3up_dir: tmpDir}
}
func (w3up *W3up) WhoAmI() (did.DID, error) {
command := fmt.Sprintf("W3_STORE_NAME=%s W3_PRINCIPAL=\"%s\" w3 whoami", w3up.w3up_dir, w3up.principal)
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatal("error initializing w3up: ", string(output), err)
return did.DID{}, err
}
pdid, err := did.Parse(strings.TrimSpace(string(output)))
if err != nil {
log.Fatal("error parsing did: ", err)
return did.DID{}, err
}
return pdid, nil
}
func (w3up *W3up) SpaceAdd() (did.DID, error) {
command := fmt.Sprintf("W3_STORE_NAME=%s w3 space add %s", w3up.w3up_dir, w3up.delegationProofPath)
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatal("error adding w3up space: ", string(output), err)
return did.DID{}, err
}
pdid, err := did.Parse(strings.TrimSpace(string(output)))
if err != nil {
log.Fatal("error parsing did: ", err)
return did.DID{}, err
}
return pdid, nil
}
func (w3up *W3up) UploadCarFile(carFile *os.File) (cid.Cid, error) {
command := fmt.Sprintf("W3_STORE_NAME=%s w3 up %s --json --no-wrap --car", w3up.w3up_dir, carFile.Name())
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatal("error uploading car file: ", string(output), err)
return cid.Undef, err
}
jsons := strings.TrimSpace(string(output))
log.Printf("w3 up output: %s\n", jsons)
var result map[string]interface{}
err = json.Unmarshal([]byte(jsons), &result)
if err != nil {
log.Fatal("error parsing json: ", err)
return cid.Undef, err
}
root, ok := result["root"].(map[string]interface{})
if !ok {
log.Fatal("error type asserting root")
return cid.Undef, fmt.Errorf("error type asserting root")
}
rcid, ok := root["/"].(string)
if !ok {
log.Fatal("error type asserting cid")
return cid.Undef, fmt.Errorf("error type asserting cid")
}
return cid.Parse(rcid)
}