mirror of
https://github.com/hoernschen/dendrite.git
synced 2024-12-26 15:08:28 +00:00
Add push server component template
This commit is contained in:
parent
092edee210
commit
6843c3beee
22 changed files with 487 additions and 0 deletions
|
@ -33,6 +33,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/federationsender"
|
"github.com/matrix-org/dendrite/federationsender"
|
||||||
"github.com/matrix-org/dendrite/internal/httputil"
|
"github.com/matrix-org/dendrite/internal/httputil"
|
||||||
"github.com/matrix-org/dendrite/keyserver"
|
"github.com/matrix-org/dendrite/keyserver"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver"
|
||||||
"github.com/matrix-org/dendrite/roomserver"
|
"github.com/matrix-org/dendrite/roomserver"
|
||||||
"github.com/matrix-org/dendrite/setup"
|
"github.com/matrix-org/dendrite/setup"
|
||||||
"github.com/matrix-org/dendrite/setup/config"
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
@ -176,6 +177,8 @@ func main() {
|
||||||
panic("failed to create new public rooms provider: " + err.Error())
|
panic("failed to create new public rooms provider: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
psAPI := pushserver.NewInternalAPI(&base.Base)
|
||||||
|
|
||||||
monolith := setup.Monolith{
|
monolith := setup.Monolith{
|
||||||
Config: base.Base.Cfg,
|
Config: base.Base.Cfg,
|
||||||
AccountDB: accountDB,
|
AccountDB: accountDB,
|
||||||
|
@ -190,6 +193,7 @@ func main() {
|
||||||
ServerKeyAPI: serverKeyAPI,
|
ServerKeyAPI: serverKeyAPI,
|
||||||
UserAPI: userAPI,
|
UserAPI: userAPI,
|
||||||
KeyAPI: keyAPI,
|
KeyAPI: keyAPI,
|
||||||
|
PushserverAPI: psAPI,
|
||||||
ExtPublicRoomsProvider: provider,
|
ExtPublicRoomsProvider: provider,
|
||||||
}
|
}
|
||||||
monolith.AddAllPublicRoutes(
|
monolith.AddAllPublicRoutes(
|
||||||
|
|
|
@ -36,6 +36,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/internal"
|
"github.com/matrix-org/dendrite/internal"
|
||||||
"github.com/matrix-org/dendrite/internal/httputil"
|
"github.com/matrix-org/dendrite/internal/httputil"
|
||||||
"github.com/matrix-org/dendrite/keyserver"
|
"github.com/matrix-org/dendrite/keyserver"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver"
|
||||||
"github.com/matrix-org/dendrite/roomserver"
|
"github.com/matrix-org/dendrite/roomserver"
|
||||||
"github.com/matrix-org/dendrite/setup"
|
"github.com/matrix-org/dendrite/setup"
|
||||||
"github.com/matrix-org/dendrite/setup/config"
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
@ -130,6 +131,12 @@ func main() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
psAPI := pushserver.NewInternalAPI(base)
|
||||||
|
if base.UseHTTPAPIs {
|
||||||
|
pushserver.AddInternalRoutes(base.InternalAPIMux, psAPI)
|
||||||
|
psAPI = base.PushServerHTTPClient()
|
||||||
|
}
|
||||||
|
|
||||||
rsComponent.SetFederationSenderAPI(fsAPI)
|
rsComponent.SetFederationSenderAPI(fsAPI)
|
||||||
|
|
||||||
monolith := setup.Monolith{
|
monolith := setup.Monolith{
|
||||||
|
@ -145,6 +152,7 @@ func main() {
|
||||||
RoomserverAPI: rsAPI,
|
RoomserverAPI: rsAPI,
|
||||||
UserAPI: userAPI,
|
UserAPI: userAPI,
|
||||||
KeyAPI: keyAPI,
|
KeyAPI: keyAPI,
|
||||||
|
PushserverAPI: psAPI,
|
||||||
ExtPublicRoomsProvider: yggrooms.NewYggdrasilRoomProvider(
|
ExtPublicRoomsProvider: yggrooms.NewYggdrasilRoomProvider(
|
||||||
ygg, fsAPI, federation,
|
ygg, fsAPI, federation,
|
||||||
),
|
),
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/eduserver/cache"
|
"github.com/matrix-org/dendrite/eduserver/cache"
|
||||||
"github.com/matrix-org/dendrite/federationsender"
|
"github.com/matrix-org/dendrite/federationsender"
|
||||||
"github.com/matrix-org/dendrite/keyserver"
|
"github.com/matrix-org/dendrite/keyserver"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver"
|
||||||
"github.com/matrix-org/dendrite/roomserver"
|
"github.com/matrix-org/dendrite/roomserver"
|
||||||
"github.com/matrix-org/dendrite/roomserver/api"
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||||||
"github.com/matrix-org/dendrite/setup"
|
"github.com/matrix-org/dendrite/setup"
|
||||||
|
@ -66,6 +67,7 @@ func main() {
|
||||||
cfg.RoomServer.InternalAPI.Connect = httpAPIAddr
|
cfg.RoomServer.InternalAPI.Connect = httpAPIAddr
|
||||||
cfg.SigningKeyServer.InternalAPI.Connect = httpAPIAddr
|
cfg.SigningKeyServer.InternalAPI.Connect = httpAPIAddr
|
||||||
cfg.SyncAPI.InternalAPI.Connect = httpAPIAddr
|
cfg.SyncAPI.InternalAPI.Connect = httpAPIAddr
|
||||||
|
cfg.PushServer.InternalAPI.Connect = httpAPIAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
base := setup.NewBaseDendrite(cfg, "Monolith", *enableHTTPAPIs)
|
base := setup.NewBaseDendrite(cfg, "Monolith", *enableHTTPAPIs)
|
||||||
|
@ -128,6 +130,12 @@ func main() {
|
||||||
}
|
}
|
||||||
rsAPI.SetAppserviceAPI(asAPI)
|
rsAPI.SetAppserviceAPI(asAPI)
|
||||||
|
|
||||||
|
psAPI := pushserver.NewInternalAPI(base)
|
||||||
|
if base.UseHTTPAPIs {
|
||||||
|
pushserver.AddInternalRoutes(base.InternalAPIMux, psAPI)
|
||||||
|
psAPI = base.PushServerHTTPClient()
|
||||||
|
}
|
||||||
|
|
||||||
monolith := setup.Monolith{
|
monolith := setup.Monolith{
|
||||||
Config: base.Cfg,
|
Config: base.Cfg,
|
||||||
AccountDB: accountDB,
|
AccountDB: accountDB,
|
||||||
|
@ -142,6 +150,7 @@ func main() {
|
||||||
ServerKeyAPI: skAPI,
|
ServerKeyAPI: skAPI,
|
||||||
UserAPI: userAPI,
|
UserAPI: userAPI,
|
||||||
KeyAPI: keyAPI,
|
KeyAPI: keyAPI,
|
||||||
|
PushserverAPI: psAPI,
|
||||||
}
|
}
|
||||||
monolith.AddAllPublicRoutes(
|
monolith.AddAllPublicRoutes(
|
||||||
base.ProcessContext,
|
base.ProcessContext,
|
||||||
|
|
33
cmd/dendrite-polylith-multi/personalities/pushserver.go
Normal file
33
cmd/dendrite-polylith-multi/personalities/pushserver.go
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package personalities
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/matrix-org/dendrite/pushserver"
|
||||||
|
"github.com/matrix-org/dendrite/setup"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func PushServer(base *setup.BaseDendrite, cfg *config.Dendrite) {
|
||||||
|
intAPI := pushserver.NewInternalAPI(base)
|
||||||
|
|
||||||
|
pushserver.AddInternalRoutes(base.InternalAPIMux, intAPI)
|
||||||
|
|
||||||
|
base.SetupAndServeHTTP(
|
||||||
|
base.Cfg.PushServer.InternalAPI.Listen, // internal listener
|
||||||
|
setup.NoListener, // external listener
|
||||||
|
nil, nil,
|
||||||
|
)
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/federationsender"
|
"github.com/matrix-org/dendrite/federationsender"
|
||||||
"github.com/matrix-org/dendrite/internal/httputil"
|
"github.com/matrix-org/dendrite/internal/httputil"
|
||||||
"github.com/matrix-org/dendrite/keyserver"
|
"github.com/matrix-org/dendrite/keyserver"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver"
|
||||||
"github.com/matrix-org/dendrite/roomserver"
|
"github.com/matrix-org/dendrite/roomserver"
|
||||||
"github.com/matrix-org/dendrite/setup"
|
"github.com/matrix-org/dendrite/setup"
|
||||||
"github.com/matrix-org/dendrite/setup/config"
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
@ -174,6 +175,7 @@ func main() {
|
||||||
cfg.SigningKeyServer.Database.ConnectionString = "file:/idb/dendritejs_signingkeyserver.db"
|
cfg.SigningKeyServer.Database.ConnectionString = "file:/idb/dendritejs_signingkeyserver.db"
|
||||||
cfg.SyncAPI.Database.ConnectionString = "file:/idb/dendritejs_syncapi.db"
|
cfg.SyncAPI.Database.ConnectionString = "file:/idb/dendritejs_syncapi.db"
|
||||||
cfg.KeyServer.Database.ConnectionString = "file:/idb/dendritejs_e2ekey.db"
|
cfg.KeyServer.Database.ConnectionString = "file:/idb/dendritejs_e2ekey.db"
|
||||||
|
cfg.PushServer.Database.ConnectionString = "file:/idb/dendritejs_pushserver.db"
|
||||||
cfg.Global.Kafka.UseNaffka = true
|
cfg.Global.Kafka.UseNaffka = true
|
||||||
cfg.Global.Kafka.Database.ConnectionString = "file:/idb/dendritejs_naffka.db"
|
cfg.Global.Kafka.Database.ConnectionString = "file:/idb/dendritejs_naffka.db"
|
||||||
cfg.Global.TrustedIDServers = []string{
|
cfg.Global.TrustedIDServers = []string{
|
||||||
|
@ -215,6 +217,8 @@ func main() {
|
||||||
rsAPI.SetFederationSenderAPI(fedSenderAPI)
|
rsAPI.SetFederationSenderAPI(fedSenderAPI)
|
||||||
p2pPublicRoomProvider := NewLibP2PPublicRoomsProvider(node, fedSenderAPI, federation)
|
p2pPublicRoomProvider := NewLibP2PPublicRoomsProvider(node, fedSenderAPI, federation)
|
||||||
|
|
||||||
|
psAPI := pushserver.NewInternalAPI(base)
|
||||||
|
|
||||||
monolith := setup.Monolith{
|
monolith := setup.Monolith{
|
||||||
Config: base.Cfg,
|
Config: base.Cfg,
|
||||||
AccountDB: accountDB,
|
AccountDB: accountDB,
|
||||||
|
@ -228,6 +232,7 @@ func main() {
|
||||||
RoomserverAPI: rsAPI,
|
RoomserverAPI: rsAPI,
|
||||||
UserAPI: userAPI,
|
UserAPI: userAPI,
|
||||||
KeyAPI: keyAPI,
|
KeyAPI: keyAPI,
|
||||||
|
PushserverAPI: psAPI,
|
||||||
//ServerKeyAPI: serverKeyAPI,
|
//ServerKeyAPI: serverKeyAPI,
|
||||||
ExtPublicRoomsProvider: p2pPublicRoomProvider,
|
ExtPublicRoomsProvider: p2pPublicRoomProvider,
|
||||||
}
|
}
|
||||||
|
|
14
pushserver/api/api.go
Normal file
14
pushserver/api/api.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
type PushserverInternalAPI interface {
|
||||||
|
QueryExample(
|
||||||
|
ctx context.Context,
|
||||||
|
request *QueryExampleRequest,
|
||||||
|
response *QueryExampleResponse,
|
||||||
|
) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type QueryExampleRequest struct{}
|
||||||
|
type QueryExampleResponse struct{}
|
82
pushserver/consumers/roomserver.go
Normal file
82
pushserver/consumers/roomserver.go
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
package consumers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/Shopify/sarama"
|
||||||
|
"github.com/matrix-org/dendrite/internal"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage"
|
||||||
|
rsapi "github.com/matrix-org/dendrite/roomserver/api"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
"github.com/matrix-org/dendrite/setup/process"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OutputRoomEventConsumer struct {
|
||||||
|
cfg *config.PushServer
|
||||||
|
psAPI api.PushserverInternalAPI
|
||||||
|
rsConsumer *internal.ContinualConsumer
|
||||||
|
db storage.Database
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOutputRoomEventConsumer(
|
||||||
|
process *process.ProcessContext,
|
||||||
|
cfg *config.PushServer,
|
||||||
|
kafkaConsumer sarama.Consumer,
|
||||||
|
store storage.Database,
|
||||||
|
psAPI api.PushserverInternalAPI,
|
||||||
|
) *OutputRoomEventConsumer {
|
||||||
|
consumer := internal.ContinualConsumer{
|
||||||
|
Process: process,
|
||||||
|
ComponentName: "pushserver/roomserver",
|
||||||
|
Topic: string(cfg.Matrix.Kafka.TopicFor(config.TopicOutputRoomEvent)),
|
||||||
|
Consumer: kafkaConsumer,
|
||||||
|
PartitionStore: store,
|
||||||
|
}
|
||||||
|
s := &OutputRoomEventConsumer{
|
||||||
|
cfg: cfg,
|
||||||
|
rsConsumer: &consumer,
|
||||||
|
db: store,
|
||||||
|
psAPI: psAPI,
|
||||||
|
}
|
||||||
|
consumer.ProcessMessage = s.onMessage
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OutputRoomEventConsumer) Start() error {
|
||||||
|
return s.rsConsumer.Start()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
|
||||||
|
var output rsapi.OutputEvent
|
||||||
|
if err := json.Unmarshal(msg.Value, &output); err != nil {
|
||||||
|
log.WithError(err).Errorf("roomserver output log: message parse failure")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch output.Type {
|
||||||
|
case rsapi.OutputTypeNewRoomEvent:
|
||||||
|
ev := output.NewRoomEvent.Event
|
||||||
|
if err := s.processMessage(*output.NewRoomEvent); err != nil {
|
||||||
|
// panic rather than continue with an inconsistent database
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"event_id": ev.EventID(),
|
||||||
|
"event": string(ev.JSON()),
|
||||||
|
log.ErrorKey: err,
|
||||||
|
}).Panicf("roomserver output log: write room event failure")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Ignore old events, peeks, so on.
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OutputRoomEventConsumer) processMessage(ore rsapi.OutputNewRoomEvent) error {
|
||||||
|
// TODO: New events from the roomserver will be passed here.
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
36
pushserver/internal/api.go
Normal file
36
pushserver/internal/api.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PushserverInternalAPI implements api.PushserverInternalAPI
|
||||||
|
type PushserverInternalAPI struct {
|
||||||
|
DB storage.Database
|
||||||
|
Cfg *config.PushServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPushserverAPI(
|
||||||
|
cfg *config.PushServer, pushserverDB storage.Database,
|
||||||
|
) *PushserverInternalAPI {
|
||||||
|
a := &PushserverInternalAPI{
|
||||||
|
DB: pushserverDB,
|
||||||
|
Cfg: cfg,
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetRoomAlias implements RoomserverAliasAPI
|
||||||
|
func (p *PushserverInternalAPI) QueryExample(
|
||||||
|
ctx context.Context,
|
||||||
|
request *api.QueryExampleRequest,
|
||||||
|
response *api.QueryExampleResponse,
|
||||||
|
) error {
|
||||||
|
// Implement QueryExample here!
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
48
pushserver/inthttp/client.go
Normal file
48
pushserver/inthttp/client.go
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
package inthttp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/internal/httputil"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
"github.com/opentracing/opentracing-go"
|
||||||
|
)
|
||||||
|
|
||||||
|
type httpPushserverInternalAPI struct {
|
||||||
|
roomserverURL string
|
||||||
|
httpClient *http.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
PushserverQueryExamplePath = "/pushserver/queryExample"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewRoomserverClient creates a PushserverInternalAPI implemented by talking to a HTTP POST API.
|
||||||
|
// If httpClient is nil an error is returned
|
||||||
|
func NewPushserverClient(
|
||||||
|
pushserverURL string,
|
||||||
|
httpClient *http.Client,
|
||||||
|
) (api.PushserverInternalAPI, error) {
|
||||||
|
if httpClient == nil {
|
||||||
|
return nil, errors.New("NewPushserverClient: httpClient is <nil>")
|
||||||
|
}
|
||||||
|
return &httpPushserverInternalAPI{
|
||||||
|
roomserverURL: pushserverURL,
|
||||||
|
httpClient: httpClient,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetRoomAlias implements RoomserverAliasAPI
|
||||||
|
func (h *httpPushserverInternalAPI) QueryExample(
|
||||||
|
ctx context.Context,
|
||||||
|
request *api.QueryExampleRequest,
|
||||||
|
response *api.QueryExampleResponse,
|
||||||
|
) error {
|
||||||
|
span, ctx := opentracing.StartSpanFromContext(ctx, "QueryExample")
|
||||||
|
defer span.Finish()
|
||||||
|
|
||||||
|
apiURL := h.roomserverURL + PushserverQueryExamplePath
|
||||||
|
return httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response)
|
||||||
|
}
|
29
pushserver/inthttp/server.go
Normal file
29
pushserver/inthttp/server.go
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package inthttp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/matrix-org/dendrite/internal/httputil"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
"github.com/matrix-org/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddRoutes adds the RoomserverInternalAPI handlers to the http.ServeMux.
|
||||||
|
// nolint: gocyclo
|
||||||
|
func AddRoutes(r api.PushserverInternalAPI, internalAPIMux *mux.Router) {
|
||||||
|
internalAPIMux.Handle(PushserverQueryExamplePath,
|
||||||
|
httputil.MakeInternalAPI("queryExample", func(req *http.Request) util.JSONResponse {
|
||||||
|
var request api.QueryExampleRequest
|
||||||
|
var response api.QueryExampleResponse
|
||||||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||||||
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
||||||
|
}
|
||||||
|
if err := r.QueryExample(req.Context(), &request, &response); err != nil {
|
||||||
|
return util.ErrorResponse(err)
|
||||||
|
}
|
||||||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
47
pushserver/pushserver.go
Normal file
47
pushserver/pushserver.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package pushserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/consumers"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/internal"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/inthttp"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage"
|
||||||
|
"github.com/matrix-org/dendrite/setup"
|
||||||
|
"github.com/matrix-org/dendrite/setup/kafka"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddInternalRoutes registers HTTP handlers for the internal API. Invokes functions
|
||||||
|
// on the given input API.
|
||||||
|
func AddInternalRoutes(router *mux.Router, intAPI api.PushserverInternalAPI) {
|
||||||
|
inthttp.AddRoutes(intAPI, router)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInternalAPI returns a concerete implementation of the internal API. Callers
|
||||||
|
// can call functions directly on the returned API or via an HTTP interface using AddInternalRoutes.
|
||||||
|
func NewInternalAPI(
|
||||||
|
base *setup.BaseDendrite,
|
||||||
|
) api.PushserverInternalAPI {
|
||||||
|
cfg := &base.Cfg.PushServer
|
||||||
|
|
||||||
|
consumer, _ := kafka.SetupConsumerProducer(&cfg.Matrix.Kafka)
|
||||||
|
|
||||||
|
pushserverDB, err := storage.Open(&cfg.Database)
|
||||||
|
if err != nil {
|
||||||
|
logrus.WithError(err).Panicf("failed to connect to room server db")
|
||||||
|
}
|
||||||
|
|
||||||
|
psAPI := internal.NewPushserverAPI(
|
||||||
|
cfg, pushserverDB,
|
||||||
|
)
|
||||||
|
|
||||||
|
rsConsumer := consumers.NewOutputRoomEventConsumer(
|
||||||
|
base.ProcessContext, cfg, consumer, pushserverDB, psAPI,
|
||||||
|
)
|
||||||
|
if err := rsConsumer.Start(); err != nil {
|
||||||
|
logrus.WithError(err).Panic("failed to start room server consumer")
|
||||||
|
}
|
||||||
|
|
||||||
|
return psAPI
|
||||||
|
}
|
7
pushserver/storage/interface.go
Normal file
7
pushserver/storage/interface.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import "github.com/matrix-org/dendrite/internal"
|
||||||
|
|
||||||
|
type Database interface {
|
||||||
|
internal.PartitionStorer
|
||||||
|
}
|
31
pushserver/storage/postgres/storage.go
Normal file
31
pushserver/storage/postgres/storage.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package postgres
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/internal/sqlutil"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage/shared"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Database struct {
|
||||||
|
shared.Database
|
||||||
|
sqlutil.PartitionOffsetStatements
|
||||||
|
}
|
||||||
|
|
||||||
|
func Open(dbProperties *config.DatabaseOptions) (*Database, error) {
|
||||||
|
var d Database
|
||||||
|
var err error
|
||||||
|
if d.DB, err = sqlutil.Open(dbProperties); err != nil {
|
||||||
|
return nil, fmt.Errorf("sqlutil.Open: %w", err)
|
||||||
|
}
|
||||||
|
d.Writer = sqlutil.NewDummyWriter()
|
||||||
|
|
||||||
|
if err = d.PartitionOffsetStatements.Prepare(d.DB, d.Writer, "pushserver"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the tables.
|
||||||
|
|
||||||
|
return &d, nil
|
||||||
|
}
|
12
pushserver/storage/shared/storage.go
Normal file
12
pushserver/storage/shared/storage.go
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package shared
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/internal/sqlutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Database struct {
|
||||||
|
DB *sql.DB
|
||||||
|
Writer sqlutil.Writer
|
||||||
|
}
|
31
pushserver/storage/sqlite3/storage.go
Normal file
31
pushserver/storage/sqlite3/storage.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/internal/sqlutil"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage/shared"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Database struct {
|
||||||
|
shared.Database
|
||||||
|
sqlutil.PartitionOffsetStatements
|
||||||
|
}
|
||||||
|
|
||||||
|
func Open(dbProperties *config.DatabaseOptions) (*Database, error) {
|
||||||
|
var d Database
|
||||||
|
var err error
|
||||||
|
if d.DB, err = sqlutil.Open(dbProperties); err != nil {
|
||||||
|
return nil, fmt.Errorf("sqlutil.Open: %w", err)
|
||||||
|
}
|
||||||
|
d.Writer = sqlutil.NewExclusiveWriter()
|
||||||
|
|
||||||
|
if err = d.PartitionOffsetStatements.Prepare(d.DB, d.Writer, "pushserver"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the tables.
|
||||||
|
|
||||||
|
return &d, nil
|
||||||
|
}
|
23
pushserver/storage/storage.go
Normal file
23
pushserver/storage/storage.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// +build !wasm
|
||||||
|
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage/postgres"
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage/sqlite3"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Open opens a database connection.
|
||||||
|
func Open(dbProperties *config.DatabaseOptions) (Database, error) {
|
||||||
|
switch {
|
||||||
|
case dbProperties.ConnectionString.IsSQLite():
|
||||||
|
return sqlite3.Open(dbProperties)
|
||||||
|
case dbProperties.ConnectionString.IsPostgres():
|
||||||
|
return postgres.Open(dbProperties)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unexpected database type")
|
||||||
|
}
|
||||||
|
}
|
20
pushserver/storage/storage_wasm.go
Normal file
20
pushserver/storage/storage_wasm.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/pushserver/storage/sqlite3"
|
||||||
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewDatabase opens a new database
|
||||||
|
func Open(dbProperties *config.DatabaseOptions) (Database, error) {
|
||||||
|
switch {
|
||||||
|
case dbProperties.ConnectionString.IsSQLite():
|
||||||
|
return sqlite3.Open(dbProperties)
|
||||||
|
case dbProperties.ConnectionString.IsPostgres():
|
||||||
|
return nil, fmt.Errorf("can't use Postgres implementation")
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unexpected database type")
|
||||||
|
}
|
||||||
|
}
|
1
pushserver/storage/tables/interface.go
Normal file
1
pushserver/storage/tables/interface.go
Normal file
|
@ -0,0 +1 @@
|
||||||
|
package tables
|
|
@ -51,6 +51,8 @@ import (
|
||||||
fsinthttp "github.com/matrix-org/dendrite/federationsender/inthttp"
|
fsinthttp "github.com/matrix-org/dendrite/federationsender/inthttp"
|
||||||
keyserverAPI "github.com/matrix-org/dendrite/keyserver/api"
|
keyserverAPI "github.com/matrix-org/dendrite/keyserver/api"
|
||||||
keyinthttp "github.com/matrix-org/dendrite/keyserver/inthttp"
|
keyinthttp "github.com/matrix-org/dendrite/keyserver/inthttp"
|
||||||
|
pushserverAPI "github.com/matrix-org/dendrite/pushserver/api"
|
||||||
|
psinthttp "github.com/matrix-org/dendrite/pushserver/inthttp"
|
||||||
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
|
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
|
||||||
rsinthttp "github.com/matrix-org/dendrite/roomserver/inthttp"
|
rsinthttp "github.com/matrix-org/dendrite/roomserver/inthttp"
|
||||||
"github.com/matrix-org/dendrite/setup/config"
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
|
@ -277,6 +279,15 @@ func (b *BaseDendrite) KeyServerHTTPClient() keyserverAPI.KeyInternalAPI {
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PushServerHTTPClient returns PushserverInternalAPI for hitting the push server over HTTP
|
||||||
|
func (b *BaseDendrite) PushServerHTTPClient() pushserverAPI.PushserverInternalAPI {
|
||||||
|
f, err := psinthttp.NewPushserverClient(b.Cfg.PushServerURL(), b.apiHttpClient)
|
||||||
|
if err != nil {
|
||||||
|
logrus.WithError(err).Panic("PushServerHTTPClient failed", b.apiHttpClient)
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
// CreateAccountsDB creates a new instance of the accounts database. Should only
|
// CreateAccountsDB creates a new instance of the accounts database. Should only
|
||||||
// be called once per component.
|
// be called once per component.
|
||||||
func (b *BaseDendrite) CreateAccountsDB() accounts.Database {
|
func (b *BaseDendrite) CreateAccountsDB() accounts.Database {
|
||||||
|
|
|
@ -65,6 +65,7 @@ type Dendrite struct {
|
||||||
SigningKeyServer SigningKeyServer `yaml:"signing_key_server"`
|
SigningKeyServer SigningKeyServer `yaml:"signing_key_server"`
|
||||||
SyncAPI SyncAPI `yaml:"sync_api"`
|
SyncAPI SyncAPI `yaml:"sync_api"`
|
||||||
UserAPI UserAPI `yaml:"user_api"`
|
UserAPI UserAPI `yaml:"user_api"`
|
||||||
|
PushServer PushServer `yaml:"push_server"`
|
||||||
|
|
||||||
MSCs MSCs `yaml:"mscs"`
|
MSCs MSCs `yaml:"mscs"`
|
||||||
|
|
||||||
|
@ -308,6 +309,7 @@ func (c *Dendrite) Defaults() {
|
||||||
c.SyncAPI.Defaults()
|
c.SyncAPI.Defaults()
|
||||||
c.UserAPI.Defaults()
|
c.UserAPI.Defaults()
|
||||||
c.AppServiceAPI.Defaults()
|
c.AppServiceAPI.Defaults()
|
||||||
|
c.PushServer.Defaults()
|
||||||
c.MSCs.Defaults()
|
c.MSCs.Defaults()
|
||||||
|
|
||||||
c.Wiring()
|
c.Wiring()
|
||||||
|
@ -340,6 +342,7 @@ func (c *Dendrite) Wiring() {
|
||||||
c.SyncAPI.Matrix = &c.Global
|
c.SyncAPI.Matrix = &c.Global
|
||||||
c.UserAPI.Matrix = &c.Global
|
c.UserAPI.Matrix = &c.Global
|
||||||
c.AppServiceAPI.Matrix = &c.Global
|
c.AppServiceAPI.Matrix = &c.Global
|
||||||
|
c.PushServer.Matrix = &c.Global
|
||||||
c.MSCs.Matrix = &c.Global
|
c.MSCs.Matrix = &c.Global
|
||||||
|
|
||||||
c.ClientAPI.Derived = &c.Derived
|
c.ClientAPI.Derived = &c.Derived
|
||||||
|
@ -547,6 +550,15 @@ func (config *Dendrite) KeyServerURL() string {
|
||||||
return string(config.KeyServer.InternalAPI.Connect)
|
return string(config.KeyServer.InternalAPI.Connect)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PushServerURL returns an HTTP URL for where the push server is listening.
|
||||||
|
func (config *Dendrite) PushServerURL() string {
|
||||||
|
// Hard code the push server to talk HTTP for now.
|
||||||
|
// If we support HTTPS we need to think of a practical way to do certificate validation.
|
||||||
|
// People setting up servers shouldn't need to get a certificate valid for the public
|
||||||
|
// internet for an internal API.
|
||||||
|
return string(config.PushServer.InternalAPI.Connect)
|
||||||
|
}
|
||||||
|
|
||||||
// SetupTracing configures the opentracing using the supplied configuration.
|
// SetupTracing configures the opentracing using the supplied configuration.
|
||||||
func (config *Dendrite) SetupTracing(serviceName string) (closer io.Closer, err error) {
|
func (config *Dendrite) SetupTracing(serviceName string) (closer io.Closer, err error) {
|
||||||
if !config.Tracing.Enabled {
|
if !config.Tracing.Enabled {
|
||||||
|
|
22
setup/config/config_pushserver.go
Normal file
22
setup/config/config_pushserver.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
type PushServer struct {
|
||||||
|
Matrix *Global `yaml:"-"`
|
||||||
|
|
||||||
|
InternalAPI InternalAPIOptions `yaml:"internal_api"`
|
||||||
|
|
||||||
|
Database DatabaseOptions `yaml:"database"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PushServer) Defaults() {
|
||||||
|
c.InternalAPI.Listen = "http://localhost:7783"
|
||||||
|
c.InternalAPI.Connect = "http://localhost:7783"
|
||||||
|
c.Database.Defaults(10)
|
||||||
|
c.Database.ConnectionString = "file:pushserver.db"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PushServer) Verify(configErrs *ConfigErrors, isMonolith bool) {
|
||||||
|
checkURL(configErrs, "room_server.internal_api.listen", string(c.InternalAPI.Listen))
|
||||||
|
checkURL(configErrs, "room_server.internal_ap.bind", string(c.InternalAPI.Connect))
|
||||||
|
checkNotEmpty(configErrs, "room_server.database.connection_string", string(c.Database.ConnectionString))
|
||||||
|
}
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/internal/transactions"
|
"github.com/matrix-org/dendrite/internal/transactions"
|
||||||
keyAPI "github.com/matrix-org/dendrite/keyserver/api"
|
keyAPI "github.com/matrix-org/dendrite/keyserver/api"
|
||||||
"github.com/matrix-org/dendrite/mediaapi"
|
"github.com/matrix-org/dendrite/mediaapi"
|
||||||
|
pushserverAPI "github.com/matrix-org/dendrite/pushserver/api"
|
||||||
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
|
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
|
||||||
"github.com/matrix-org/dendrite/setup/config"
|
"github.com/matrix-org/dendrite/setup/config"
|
||||||
"github.com/matrix-org/dendrite/setup/process"
|
"github.com/matrix-org/dendrite/setup/process"
|
||||||
|
@ -51,6 +52,7 @@ type Monolith struct {
|
||||||
ServerKeyAPI serverKeyAPI.SigningKeyServerAPI
|
ServerKeyAPI serverKeyAPI.SigningKeyServerAPI
|
||||||
UserAPI userapi.UserInternalAPI
|
UserAPI userapi.UserInternalAPI
|
||||||
KeyAPI keyAPI.KeyInternalAPI
|
KeyAPI keyAPI.KeyInternalAPI
|
||||||
|
PushserverAPI pushserverAPI.PushserverInternalAPI
|
||||||
|
|
||||||
// Optional
|
// Optional
|
||||||
ExtPublicRoomsProvider api.ExtraPublicRoomsProvider
|
ExtPublicRoomsProvider api.ExtraPublicRoomsProvider
|
||||||
|
|
Loading…
Reference in a new issue