This commit is contained in:
tobi 2022-04-05 13:59:57 +00:00 committed by GitHub
commit 21e1056a74
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 22 deletions

View file

@ -58,13 +58,23 @@ type Database interface {
//
// The library makes this call only after acquiring a lock first.
OutboxForInbox(c context.Context, inboxIRI *url.URL) (outboxIRI *url.URL, err error)
// InboxForActor fetches the inbox corresponding to the given actorIRI.
// InboxesForIRI fetches inboxes corresponding to the given iri.
// This allows your server to skip remote dereferencing of iris
// in order to speed up message delivery, if desired.
//
// It is acceptable to just return nil for the inboxIRI. In this case, the library will
// attempt to resolve the inbox of the actor by remote dereferencing instead.
// It is acceptable to just return nil or an empty slice for the inboxIRIs,
// if you don't know the inbox iri, or you don't wish to use this feature.
// In this case, the library will attempt to resolve inboxes of the iri
// by remote dereferencing instead.
//
// If the input iri is the iri of an Actor, then the inbox for the actor
// should be returned as a single-entry slice.
//
// If the input iri is a Collection (such as a Collection of followers),
// then each follower inbox IRI should be returned in the inboxIRIs slice.
//
// The library makes this call only after acquiring a lock first.
InboxForActor(c context.Context, actorIRI *url.URL) (inboxIRI *url.URL, err error)
InboxesForIRI(c context.Context, iri *url.URL) (inboxIRIs []*url.URL, err error)
// Exists returns true if the database has an entry for the specified
// id. It may not be owned by this application instance.
//

View file

@ -199,19 +199,19 @@ func (mr *MockDatabaseMockRecorder) InboxContains(c, inbox, id interface{}) *gom
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InboxContains", reflect.TypeOf((*MockDatabase)(nil).InboxContains), c, inbox, id)
}
// InboxForActor mocks base method.
func (m *MockDatabase) InboxForActor(c context.Context, actorIRI *url.URL) (*url.URL, error) {
// InboxesForIRI mocks base method.
func (m *MockDatabase) InboxesForIRI(c context.Context, iri *url.URL) ([]*url.URL, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "InboxForActor", c, actorIRI)
ret0, _ := ret[0].(*url.URL)
ret := m.ctrl.Call(m, "InboxesForIRI", c, iri)
ret0, _ := ret[0].([]*url.URL)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// InboxForActor indicates an expected call of InboxForActor.
func (mr *MockDatabaseMockRecorder) InboxForActor(c, actorIRI interface{}) *gomock.Call {
// InboxesForIRI indicates an expected call of InboxesForIRI.
func (mr *MockDatabaseMockRecorder) InboxesForIRI(c, iri interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InboxForActor", reflect.TypeOf((*MockDatabase)(nil).InboxForActor), c, actorIRI)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InboxesForIRI", reflect.TypeOf((*MockDatabase)(nil).InboxesForIRI), c, iri)
}
// Liked mocks base method.

View file

@ -681,7 +681,6 @@ func (a *sideEffectActor) prepare(c context.Context, outboxIRI *url.URL, activit
// first check if the implemented database logic can return any inboxes
// from our list of actor IRIs.
foundInboxesFromDB := []*url.URL{}
foundActorsFromDB := []*url.URL{}
for _, actorIRI := range r {
// BEGIN LOCK
err = a.db.Lock(c, actorIRI)
@ -689,16 +688,20 @@ func (a *sideEffectActor) prepare(c context.Context, outboxIRI *url.URL, activit
return
}
inbox, err := a.db.InboxForActor(c, actorIRI)
inboxes, err := a.db.InboxesForIRI(c, actorIRI)
if err != nil {
// bail on error
a.db.Unlock(c, actorIRI)
return nil, err
}
if inbox != nil {
if len(inboxes) > 0 {
// we have a hit
foundInboxesFromDB = append(foundInboxesFromDB, inbox)
foundActorsFromDB = append(foundActorsFromDB, actorIRI)
foundInboxesFromDB = append(foundInboxesFromDB, inboxes...)
// if we found inboxes for this iri, we should remove it from
// the list of actors/iris we still need to dereference
r = removeOne(r, actorIRI)
}
// END LOCK
@ -708,12 +711,6 @@ func (a *sideEffectActor) prepare(c context.Context, outboxIRI *url.URL, activit
}
}
// for every actor we found an inbox for in the db, we should
// remove it from the list of actors we still need to dereference
for _, actorIRI := range foundActorsFromDB {
r = removeOne(r, actorIRI)
}
// look for any actors' inboxes that weren't already discovered above;
// find these by making dereference calls to remote instances
t, err := a.common.NewTransport(c, outboxIRI, goFedUserAgent())