Add code missing in the previous commit
parent
d6b5850827
commit
fe19806af2
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,15 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
typegen "github.com/whyrusleeping/cbor-gen"
|
||||
|
||||
"github.com/uabluerail/indexer/util/plc"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := typegen.WriteMapEncodersToFile("cbor_gen.go", "plc", plc.Service{}, plc.Op{}, plc.Tombstone{}, plc.LegacyCreateOp{}); err != nil {
|
||||
log.Fatalf("%s", err)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
package plc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
cid "github.com/ipfs/go-cid"
|
||||
"github.com/multiformats/go-multicodec"
|
||||
"github.com/multiformats/go-multihash"
|
||||
cbg "github.com/whyrusleeping/cbor-gen"
|
||||
)
|
||||
|
||||
//go:generate go run ./gen
|
||||
|
||||
type Op struct {
|
||||
Type string `json:"type" cborgen:"type,const=plc_operation"`
|
||||
RotationKeys []string `json:"rotationKeys" cborgen:"rotationKeys"`
|
||||
VerificationMethods map[string]string `json:"verificationMethods" cborgen:"verificationMethods"`
|
||||
AlsoKnownAs []string `json:"alsoKnownAs" cborgen:"alsoKnownAs"`
|
||||
Services map[string]Service `json:"services" cborgen:"services"`
|
||||
Prev *string `json:"prev" cborgen:"prev"`
|
||||
Sig *string `json:"sig" cborgen:"sig,omitempty"`
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
Type string `json:"type" cborgen:"type"`
|
||||
Endpoint string `json:"endpoint" cborgen:"endpoint"`
|
||||
}
|
||||
|
||||
type Tombstone struct {
|
||||
Type string `json:"type" cborgen:"type,const=plc_tombstone"`
|
||||
Prev string `json:"prev" cborgen:"prev"`
|
||||
Sig *string `json:"sig" cborgen:"sig,omitempty"`
|
||||
}
|
||||
|
||||
type LegacyCreateOp struct {
|
||||
Type string `json:"type" cborgen:"type,const=create"`
|
||||
SigningKey string `json:"signingKey" cborgen:"signingKey"`
|
||||
RecoveryKey string `json:"recoveryKey" cborgen:"recoveryKey"`
|
||||
Handle string `json:"handle" cborgen:"handle"`
|
||||
Service string `json:"service" cborgen:"service"`
|
||||
Prev *string `json:"prev" cborgen:"prev"`
|
||||
Sig *string `json:"sig" cborgen:"sig,omitempty"`
|
||||
}
|
||||
|
||||
func (op *LegacyCreateOp) AsUnsignedOp() Op {
|
||||
return Op{
|
||||
Type: "plc_operation",
|
||||
Prev: op.Prev,
|
||||
AlsoKnownAs: []string{fmt.Sprintf("at://%s", op.Handle)},
|
||||
RotationKeys: []string{op.RecoveryKey},
|
||||
Services: map[string]Service{
|
||||
"atproto_pds": {
|
||||
Type: "AtprotoPersonalDataServer",
|
||||
Endpoint: op.Service,
|
||||
}},
|
||||
VerificationMethods: map[string]string{
|
||||
"atproto": op.SigningKey,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type OperationKind interface {
|
||||
CID() (cid.Cid, error)
|
||||
}
|
||||
|
||||
type Operation struct {
|
||||
Value OperationKind
|
||||
}
|
||||
|
||||
type OperationLogEntry struct {
|
||||
DID string `json:"did"`
|
||||
Operation Operation `json:"operation"`
|
||||
CID string `json:"cid"`
|
||||
Nullified bool `json:"nullified"`
|
||||
CreatedAt string `json:"createdAt"`
|
||||
}
|
||||
|
||||
func unmarshal[T any](b []byte) (T, error) {
|
||||
var out T
|
||||
if err := json.Unmarshal(b, &out); err != nil {
|
||||
return out, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (o *Operation) UnmarshalJSON(b []byte) error {
|
||||
var partial struct {
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(b, &partial); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch partial.Type {
|
||||
case "create":
|
||||
v, err := unmarshal[LegacyCreateOp](b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
o.Value = v
|
||||
return nil
|
||||
case "plc_operation":
|
||||
v, err := unmarshal[Op](b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
o.Value = v
|
||||
return nil
|
||||
case "plc_tombstone":
|
||||
v, err := unmarshal[Tombstone](b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
o.Value = v
|
||||
return nil
|
||||
default:
|
||||
return fmt.Errorf("unsupported 'type' value: %q", partial.Type)
|
||||
}
|
||||
}
|
||||
|
||||
func (o Operation) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(o.Value)
|
||||
}
|
||||
|
||||
func calculateCid(v cbg.CBORMarshaler) (cid.Cid, error) {
|
||||
b := bytes.NewBuffer(nil)
|
||||
if err := v.MarshalCBOR(b); err != nil {
|
||||
return cid.Cid{}, fmt.Errorf("marshaling as CBOR: %w", err)
|
||||
}
|
||||
return cid.V1Builder{
|
||||
Codec: uint64(multicodec.DagCbor),
|
||||
MhType: multihash.SHA2_256,
|
||||
}.Sum(b.Bytes())
|
||||
}
|
||||
|
||||
func (o Op) CID() (cid.Cid, error) {
|
||||
return calculateCid(&o)
|
||||
}
|
||||
|
||||
func (o Tombstone) CID() (cid.Cid, error) {
|
||||
return calculateCid(&o)
|
||||
}
|
||||
|
||||
func (o LegacyCreateOp) CID() (cid.Cid, error) {
|
||||
return calculateCid(&o)
|
||||
}
|
Loading…
Reference in New Issue