forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

impl async resolver for multiple idents

Changed files
+53 -16
appview
pages
templates
state
knotserver
git
types
+1 -1
appview/pages/pages.go
···
func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error {
if params.Lines < 5000 {
c := params.Contents
-
style := styles.Get("xcode")
+
style := styles.Get("bw")
formatter := chromahtml.New(
chromahtml.InlineCode(true),
chromahtml.WithLineNumbers(true),
+1 -1
appview/pages/templates/repo/blob.html
···
{{ end }}
{{ end }}
</div>
-
<div id="file-info">
+
<div id="file-info" class="text-gray-500 text-xs">
{{ .Lines }} lines
<span class="select-none px-2 [&:before]:content-['·']"></span>
{{ byteFmt .SizeHint }}
+1 -1
appview/pages/templates/repo/commit.html
···
{{ else }}
<pre class="overflow-auto">
{{- range .TextFragments -}}
-
<div class="bg-gray-100 text-gray-500 select-none">{{ .Comment }}</div>
+
<div class="bg-gray-100 text-gray-500 select-none">{{ .Header }}</div>
{{- range .Lines -}}
{{- if eq .Op.String "+" -}}
+32
appview/resolver.go
···
import (
"context"
+
"sync"
"github.com/bluesky-social/indigo/atproto/identity"
"github.com/bluesky-social/indigo/atproto/syntax"
···
return r.directory.Lookup(ctx, *id)
}
+
+
func (r *Resolver) ResolveIdents(ctx context.Context, idents []string) []*identity.Identity {
+
results := make([]*identity.Identity, len(idents))
+
var wg sync.WaitGroup
+
+
// Create a channel to handle context cancellation
+
done := make(chan struct{})
+
defer close(done)
+
+
// Start a goroutine for each identifier
+
for idx, ident := range idents {
+
wg.Add(1)
+
go func(index int, id string) {
+
defer wg.Done()
+
+
select {
+
case <-ctx.Done():
+
results[index] = nil
+
case <-done:
+
results[index] = nil
+
default:
+
// Resolve the identifier - if error, identity will be nil
+
identity, _ := r.ResolveIdent(ctx, id)
+
results[index] = identity
+
}
+
}(idx, ident)
+
}
+
+
wg.Wait()
+
return results
+
}
+14 -9
appview/state/repo.go
···
did := item[0]
-
var handle string
-
id, err := s.resolver.ResolveIdent(ctx, did)
-
if err != nil {
-
handle = ""
-
} else {
-
handle = string(id.Handle)
-
}
-
c := pages.Collaborator{
Did: did,
-
Handle: handle,
+
Handle: "",
Role: role,
}
collaborators = append(collaborators, c)
+
}
+
+
// populate all collborators with handles
+
identsToResolve := make([]string, len(collaborators))
+
for i, collab := range collaborators {
+
identsToResolve[i] = collab.Did
+
}
+
+
resolvedIdents := s.resolver.ResolveIdents(ctx, identsToResolve)
+
for i, resolved := range resolvedIdents {
+
if resolved != nil {
+
collaborators[i].Handle = resolved.Handle.String()
+
}
}
return collaborators, nil
+2 -2
knotserver/git/diff.go
···
for _, tf := range d.TextFragments {
ndiff.TextFragments = append(ndiff.TextFragments, types.TextFragment{
-
Comment: tf.Comment,
-
Lines: tf.Lines,
+
Header: tf.Header(),
+
Lines: tf.Lines,
})
for _, l := range tf.Lines {
switch l.Op {
+2 -2
types/diff.go
···
)
type TextFragment struct {
-
Comment string `json:"comment"`
-
Lines []gitdiff.Line `json:"lines"`
+
Header string `json:"comment"`
+
Lines []gitdiff.Line `json:"lines"`
}
type Diff struct {