mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-09 17:44:59 +09:00
Merge branch 'main' of github.com:anyproto/anytype-heart into feature/spaces
# Conflicts: # .mockery.yaml # core/anytype/bootstrap.go # core/block/collection/service.go # core/block/collection/service_test.go # core/block/editor/factory.go # core/block/editor/file/uploader_test.go # core/block/export/export.go # core/block/import/importer.go # core/block/object/objectcreator/creator.go # core/block/service.go # core/event/mock_event/mock_Sender.go # core/filestorage/fileservice.go # core/filestorage/filesync/filesync.go # core/filestorage/filesync/filesync_test.go # core/kanban/service_test.go # core/subscription/service.go # core/subscription/service_test.go # core/syncstatus/service.go # go.mod # go.sum # space/typeprovider/typeprovider.go
This commit is contained in:
commit
c3c4b0abb7
70 changed files with 3196 additions and 1346 deletions
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
|
@ -18,7 +18,7 @@ jobs:
|
|||
- name: Install Go
|
||||
uses: actions/setup-go@v1
|
||||
with:
|
||||
go-version: 1.19.8
|
||||
go-version: 1.21
|
||||
- name: Setup GO
|
||||
run: |
|
||||
echo GOPATH=$(go env GOPATH) >> $GITHUB_ENV
|
||||
|
@ -195,7 +195,7 @@ jobs:
|
|||
- name: Install Go
|
||||
uses: actions/setup-go@v1
|
||||
with:
|
||||
go-version: 1.19.8
|
||||
go-version: 1.21
|
||||
- name: Setup GO
|
||||
run: |
|
||||
echo GOPATH=$(go env GOPATH) >> $GITHUB_ENV
|
||||
|
|
61
.github/workflows/force-mirror-any-block.yml
vendored
61
.github/workflows/force-mirror-any-block.yml
vendored
|
@ -1,61 +0,0 @@
|
|||
name: Force Mirror Changes to any-block
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
force-mirror-anyblock:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout anytype-heart
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
fetch-depth: 2
|
||||
path: anytype-heart
|
||||
|
||||
- name: Set variables
|
||||
run: |
|
||||
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Update import paths
|
||||
run: |
|
||||
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
|
||||
sed -i -E '/google/! s/(import\s+")([^\/]+\/)*([^\/]+\.proto")/\1\3/g' "anytype-heart/$file"
|
||||
done
|
||||
|
||||
- name: Clone any-block
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: anyproto/any-block
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: any-block
|
||||
|
||||
- name: Copy changed files to any-block
|
||||
run: |
|
||||
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
|
||||
cp -f "anytype-heart/$file" any-block/
|
||||
done
|
||||
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: 'stable'
|
||||
|
||||
- name: Generate documentation using proto-gen-doc
|
||||
run: |
|
||||
cd any-block
|
||||
echo "Installing proto"
|
||||
sudo apt-get update && sudo apt-get install -y protobuf-compiler
|
||||
echo "Installing protoc-gen-doc"
|
||||
go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
|
||||
echo "Running protoc"
|
||||
protoc --doc_out=. --doc_opt=html,index.html *.proto
|
||||
|
||||
- name: Commit and push changes to any-block
|
||||
run: |
|
||||
cd any-block
|
||||
git config --global user.email "association@anytype.io"
|
||||
git config --global user.name "Any Association"
|
||||
git add .
|
||||
git commit -m "Update proto files"
|
||||
git push origin main
|
2
.github/workflows/golangci-lint.yml
vendored
2
.github/workflows/golangci-lint.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: 1.19
|
||||
go-version: 1.21
|
||||
env:
|
||||
GOPRIVATE: "github.com/anyproto"
|
||||
- name: git config
|
||||
|
|
44
.github/workflows/mirror-any-block.yml
vendored
44
.github/workflows/mirror-any-block.yml
vendored
|
@ -2,75 +2,51 @@ name: Mirror Changes to any-block
|
|||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'pkg/lib/pb/model/protos/models.proto'
|
||||
- 'pb/protos/changes.proto'
|
||||
- 'pb/protos/events.proto'
|
||||
- 'pb/protos/snapshot.proto'
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
mirror-anyblock:
|
||||
if: ${{ github.repository_owner == 'anyproto' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout anytype-heart
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.ANY_CLA_TOKEN }}
|
||||
fetch-depth: 2
|
||||
path: anytype-heart
|
||||
|
||||
- name: Set variables
|
||||
run: |
|
||||
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Find changed files
|
||||
run: |
|
||||
cd anytype-heart
|
||||
files=$(comm -12 <(echo "${{ env.any-block-files }}" | tr ',' '\n' | sort) <(git diff --name-only HEAD HEAD~1 | sort))
|
||||
if [ -z "$files" ]; then
|
||||
echo "changed=false" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "changed=true" >> "$GITHUB_ENV"
|
||||
fi
|
||||
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto,pb/protos/snapshot.proto" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Update import paths
|
||||
if: ${{ env.changed == 'true' }}
|
||||
run: |
|
||||
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
|
||||
sed -i -E '/google/! s/(import\s+")([^\/]+\/)*([^\/]+\.proto")/\1\3/g' "anytype-heart/$file"
|
||||
done
|
||||
|
||||
- name: Clone any-block
|
||||
if: ${{ env.changed == 'true' }}
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: anyproto/any-block
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.ANY_CLA_TOKEN }}
|
||||
path: any-block
|
||||
|
||||
- name: Copy changed files to any-block
|
||||
if: ${{ env.changed == 'true' }}
|
||||
run: |
|
||||
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
|
||||
cp -f "anytype-heart/$file" any-block/
|
||||
done
|
||||
|
||||
- name: Install Go
|
||||
if: ${{ env.changed == 'true' }}
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: 'stable'
|
||||
|
||||
- name: Generate documentation using proto-gen-doc
|
||||
if: ${{ env.changed == 'true' }}
|
||||
run: |
|
||||
cd any-block
|
||||
echo "Installing proto"
|
||||
sudo apt-get update && sudo apt-get install -y protobuf-compiler
|
||||
echo "Installing protoc-gen-doc"
|
||||
go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
|
||||
echo "Running protoc"
|
||||
protoc --doc_out=. --doc_opt=html,index.html *.proto
|
||||
|
||||
- name: Commit and push changes to any-block
|
||||
if: ${{ env.changed == 'true' }}
|
||||
run: |
|
||||
cd any-block
|
||||
git config --global user.email "association@anytype.io"
|
||||
|
|
10
.github/workflows/test.yml
vendored
10
.github/workflows/test.yml
vendored
|
@ -58,6 +58,16 @@ jobs:
|
|||
rm -rf ~/gotestsum-report
|
||||
mkdir ~/gotestsum-report
|
||||
CGO_CFLAGS="-Wno-deprecated-declarations -Wno-deprecated-non-prototype -Wno-xor-used-as-pow" gotestsum --junitfile ~/gotestsum-report/gotestsum-report.xml -- -tags "nogrpcserver nographviz" -p 1 $(echo $PACKAGE_NAMES) -race -coverprofile=coverage.out -covermode=atomic ./...
|
||||
|
||||
generated_pattern='^\/\/ Code generated .* DO NOT EDIT\.$'
|
||||
files_list=$(grep -rl "$generated_pattern" . | grep '\.go$' | sed 's/^\.\///')
|
||||
|
||||
for file in $files_list; do
|
||||
echo "Removing $file from coverage report"
|
||||
grep -v "$file" coverage.out > temp_file
|
||||
mv temp_file coverage.out
|
||||
done
|
||||
|
||||
COVERAGE=$(go tool cover -func coverage.out | grep total | awk '{print substr($3, 1, length($3)-1)}')
|
||||
echo "coverage_middleware $COVERAGE" | curl --data-binary @- --user "$prometheus_username:$prometheus_password" https://pushgateway.anytype.io/metrics/job/tech_quality
|
||||
- name: Publish Test Report
|
||||
|
|
|
@ -6,7 +6,7 @@ run:
|
|||
# don't check generated protobuf files
|
||||
skip-dirs:
|
||||
- pkg/lib/pb
|
||||
go: '1.19'
|
||||
go: '1.21'
|
||||
|
||||
linters-settings:
|
||||
errcheck:
|
||||
|
|
|
@ -22,3 +22,9 @@ packages:
|
|||
github.com/anyproto/anytype-heart/core/block/import/converter:
|
||||
interfaces:
|
||||
Converter:
|
||||
github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore:
|
||||
interfaces:
|
||||
ObjectStore:
|
||||
github.com/anyproto/anytype-heart/core/block/restriction:
|
||||
interfaces:
|
||||
Service:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM golang:1.19 AS builder
|
||||
FROM golang:1.21 AS builder
|
||||
MAINTAINER Anytype <dev@anytype.io>
|
||||
|
||||
# This is (in large part) copied (with love) from
|
||||
|
|
187
README.md
187
README.md
|
@ -1,185 +1,12 @@
|
|||
# Anytype Heart
|
||||
Middleware library for Anytype, distributed as part of the Anytype clients.
|
||||
|
||||
## Build from Source
|
||||
1. Install Golang 1.19.x [from here](http://golang.org/dl/) or using preferred package manager
|
||||
2. Follow instructions below for the target systems
|
||||
|
||||
|
||||
|
||||
### Install local deps
|
||||
|
||||
#### Mac
|
||||
As of 16.01.23 last protobuf version (21.12) broke the JS plugin support, so you can use the v3 branch:
|
||||
```
|
||||
brew install protobuf@3
|
||||
```
|
||||
|
||||
To generate Swift protobuf:
|
||||
```
|
||||
brew install swift-protobuf
|
||||
```
|
||||
|
||||
#### Debian/Ubuntu
|
||||
We need to have protoc binary (3.x version) and libprotoc headers in orderto build the grpc-web plugin
|
||||
```
|
||||
apt install protobuf-compiler libprotoc-dev
|
||||
```
|
||||
|
||||
### Build and install for the [desktop client](https://github.com/anyproto/anytype-ts)
|
||||
`make install-dev-js` — build the local server and copy it and protobuf binding into `../anytype-ts`
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
|
||||
### Build for iOS
|
||||
Instructions to set up environment for iOS: [here](https://github.com/anyproto/anytype-swift/blob/main/docs/Setup_For_Middleware.md)
|
||||
1. `make build-ios` to build the framework into `dist/ios` folder
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
2. `make protos-swift` to generate swift protobuf bindings into `dist/ios/pb`
|
||||
|
||||
### Build for Android
|
||||
Instructions to setup environment for Android: [here](https://github.com/anyproto/anytype-kotlin/blob/main/docs/Setup_For_Middleware.md)
|
||||
1. `make build-android` to build the library into `dist/android` folder
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
2. `make protos-java` to generate java protobuf bindings into `dist/android/pb`
|
||||
|
||||
## Rebuild protobuf generated files
|
||||
First, you need to install [protobuf](https://github.com/anyproto/anytype-heart#install-local-deps-mac) pkg using your preferred package manager.
|
||||
This repo uses custom protoc located at [anyproto/protobuf](https://github.com/anyproto/protobuf/tree/master/protoc-gen-gogo). It adds `gomobile` plugin and some env-controlled options to control the generated code style.
|
||||
This protobuf generator will replace your `protoc` binary, BTW it doesn't have any breaking changes for other protobuf and grpc code
|
||||
|
||||
You can override the binary with a simple command:
|
||||
```
|
||||
make setup-protoc
|
||||
```
|
||||
|
||||
Then you can easily regenerate proto files:
|
||||
```
|
||||
make protos
|
||||
```
|
||||
|
||||
## Run tests
|
||||
Install dependencies for running tests and generate mocks:
|
||||
```
|
||||
make test-deps
|
||||
```
|
||||
|
||||
GO test:
|
||||
```
|
||||
make test
|
||||
```
|
||||
You'll need to install latest (at least clang 15)
|
||||
```
|
||||
brew install llvm
|
||||
echo 'export PATH="/<homebrew location>/llvm/bin:$PATH"' >> ~/.zshrc
|
||||
```
|
||||
|
||||
### Integration tests
|
||||
First you need to start a docker container via docker-compose:
|
||||
```
|
||||
export ANYTYPE_TEST_GRPC_PORT=31088
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
Then you can run the basic integration tests:
|
||||
```
|
||||
make test-integration
|
||||
```
|
||||
|
||||
|
||||
## Run local gRPC server to debug
|
||||
⚠️ Make sure to update/install protobuf compiler from [this repo](https://github.com/anyproto/protobuf) using `make setup-protoc`
|
||||
|
||||
Commands:
|
||||
- `make run-server` - builds proto files for grpc server, builds the binary and runs it
|
||||
- `make build-server` - builds proto files for grpc server and builds the binary into `dist/server`
|
||||
|
||||
If you want to change the default port(9999):
|
||||
|
||||
`ANYTYPE_GRPC_ADDR=127.0.0.1:8888 make run-debug`
|
||||
|
||||
----
|
||||
## Useful tools for debug
|
||||
|
||||
### Debug server
|
||||
Use env var ANYDEBUG=address to enable debugging HTTP server. For example: `ANYDEBUG=:6061` will start debug server on port 6061
|
||||
|
||||
You can find all endpoints in `/debug` page. For example: http://localhost:6061/debug
|
||||
|
||||
### gRPC logging
|
||||
In order to log mw gRPC requests/responses use `ANYTYPE_GRPC_LOG` env var:
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=1` - log only method names
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=2` - log method names + payloads for commands
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=2` - log method names + payloads for commands&events
|
||||
|
||||
### gRPC tracing
|
||||
1. Run jaeger UI on the local machine:
|
||||
```docker run --rm -d -p6832:6832/udp -p6831:6831/udp -p16686:16686 -p5778:5778 -p5775:5775/udp jaegertracing/all-in-one:latest```
|
||||
2. Run mw with `ANYTYPE_GRPC_TRACE` env var:
|
||||
- `ANYTYPE_GRPC_TRACE=1` - log only method names/times
|
||||
- `ANYTYPE_GRPC_TRACE=2` - log method names + payloads for commands
|
||||
- `ANYTYPE_GRPC_TRACE=2` - log method names + payloads for commands&events
|
||||
3. Open Jaeger UI at http://localhost:16686
|
||||
|
||||
### Debug tree
|
||||
1. You can use `cmd/debugtree.go` to perform different operations with tree exported in zip archive (`rpc DebugTree`)
|
||||
2. The usage looks like this `go run debugtree.go -j -t -f [path to zip archive]` where `-t` tells the cmd to generate tree graph view and `-j` - to generate json representation of the tree (i.e. data in each individual block)
|
||||
3. You can use flag `-r` to build the tree from its root, that way you will see all the changes in the tree, and not only those from the common snapshot
|
||||
3. For more info please check the command usage in `debugtree.go`
|
||||
|
||||
### gRPC clients
|
||||
|
||||
#### GUI
|
||||
|
||||
https://github.com/uw-labs/bloomrpc
|
||||
|
||||
HowTo: Set the import path to the middleware root, then select commands.proto file
|
||||
|
||||
#### CLI
|
||||
|
||||
https://github.com/fullstorydev/grpcurl
|
||||
|
||||
You should specify import-path to the root of anytype-heart repository and gRPC port of running application
|
||||
|
||||
Command examples:
|
||||
|
||||
- List available methods
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe
|
||||
```
|
||||
|
||||
- Describe method signature
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
- Describe structure of specified protobuf message
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe .anytype.Rpc.Object.Create.Request
|
||||
```
|
||||
|
||||
- Call method with specified plain-text payload
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto -plaintext -d '{"details": {"name": "hello there", "type": "ot-page"}}' localhost:31007 anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
- Call method using unix pipe
|
||||
```
|
||||
echo '{"details": {"name": "hello there", "type": "ot-page"}}' | grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto -plaintext -d @ localhost:31007 anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
## Running with prometheus and grafana
|
||||
- `cd metrics/docker` – cd into folder with docker-compose file
|
||||
- `docker-compose up` - run the prometheus/grafana
|
||||
- use `ANYTYPE_PROM=0.0.0.0:9094` when running middleware to enable metrics collection. Client commands metrics available only in gRPC mode
|
||||
- open http://127.0.0.1:3000 to view collected metrics in Grafana. You can find several dashboards there:
|
||||
- **MW** internal middleware metrics such as changes, added and created threads histograms
|
||||
- **MW commands server** metrics for clients commands. Works only in grpc-server mode
|
||||
## Docs
|
||||
- [Build instructions](docs/Build.md)
|
||||
- [Protobuf generation](docs/Protogen.md)
|
||||
- [Testing instructions](docs/Testing.md)
|
||||
- [Debug instructions](docs/Debug.md)
|
||||
- [Project architecture](docs/Architecture.md)
|
||||
|
||||
## Contribution
|
||||
Thank you for your desire to develop Anytype together!
|
||||
|
@ -195,4 +22,4 @@ Thank you for your desire to develop Anytype together!
|
|||
---
|
||||
Made by Any — a Swiss association 🇨🇭
|
||||
|
||||
Licensed under [Any Source Available License 1.0](./LICENSE.md).
|
||||
Licensed under [Any Source Available License 1.0](LICENSE.md).
|
||||
|
|
|
@ -10,10 +10,12 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/anyproto/anytype-heart/pb"
|
||||
|
||||
"github.com/gogo/protobuf/jsonpb"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
|
||||
"github.com/anyproto/anytype-heart/pb"
|
||||
"github.com/anyproto/anytype-heart/util/constant"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -66,16 +68,19 @@ func processFile(file File, outputFile string) {
|
|||
}
|
||||
|
||||
// assuming Snapshot is a protobuf message
|
||||
snapshot := pb.SnapshotWithType{}
|
||||
var snapshot proto.Message = &pb.SnapshotWithType{}
|
||||
if strings.HasPrefix(file.Name, constant.ProfileFile) {
|
||||
snapshot = &pb.Profile{}
|
||||
}
|
||||
|
||||
if strings.HasSuffix(file.Name, ".json") {
|
||||
|
||||
if err := jsonpb.UnmarshalString(string(content), &snapshot); err != nil {
|
||||
if err := jsonpb.UnmarshalString(string(content), snapshot); err != nil {
|
||||
log.Fatalf("Failed to parse jsonpb message: %v", err)
|
||||
}
|
||||
|
||||
// convert to pb and write to outputFile
|
||||
pbData, err := proto.Marshal(&snapshot)
|
||||
pbData, err := proto.Marshal(snapshot)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to marshal jsonpb message to protobuf: %v", err)
|
||||
}
|
||||
|
@ -88,12 +93,12 @@ func processFile(file File, outputFile string) {
|
|||
|
||||
} else {
|
||||
|
||||
if err := proto.Unmarshal(content, &snapshot); err != nil {
|
||||
if err := proto.Unmarshal(content, snapshot); err != nil {
|
||||
log.Fatalf("Failed to parse protobuf message: %v", err)
|
||||
}
|
||||
|
||||
// convert to jsonpb and write to outputFile
|
||||
jsonData, err := jsonM.MarshalToString(&snapshot)
|
||||
jsonData, err := jsonM.MarshalToString(snapshot)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to marshal protobuf message to json: %v", err)
|
||||
}
|
||||
|
@ -193,8 +198,14 @@ func createZipFromDirectory(input, output string) {
|
|||
return err
|
||||
}
|
||||
|
||||
isProfile := strings.HasPrefix(info.Name(), constant.ProfileFile)
|
||||
|
||||
// assuming Snapshot is a protobuf message
|
||||
snapshot := &pb.SnapshotWithType{}
|
||||
var snapshot proto.Message = &pb.SnapshotWithType{}
|
||||
if isProfile {
|
||||
snapshot = &pb.Profile{}
|
||||
}
|
||||
|
||||
err = jsonpb.UnmarshalString(string(data), snapshot)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -205,7 +216,11 @@ func createZipFromDirectory(input, output string) {
|
|||
return err
|
||||
}
|
||||
|
||||
fw, err := w.Create(strings.TrimSuffix(rel, ".json") + ".pb")
|
||||
name := strings.TrimSuffix(rel, ".json") + ".pb"
|
||||
if isProfile {
|
||||
name = strings.TrimSuffix(name, ".pb")
|
||||
}
|
||||
fw, err := w.Create(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -41,7 +41,6 @@ import (
|
|||
"github.com/anyproto/anytype-heart/core/block/source"
|
||||
"github.com/anyproto/anytype-heart/core/configfetcher"
|
||||
"github.com/anyproto/anytype-heart/core/debug"
|
||||
"github.com/anyproto/anytype-heart/core/event"
|
||||
"github.com/anyproto/anytype-heart/core/files"
|
||||
"github.com/anyproto/anytype-heart/core/filestorage"
|
||||
"github.com/anyproto/anytype-heart/core/filestorage/filesync"
|
||||
|
@ -97,7 +96,9 @@ func BootstrapWallet(rootPath string, derivationResult crypto.DerivationResult)
|
|||
|
||||
func StartNewApp(ctx context.Context, clientWithVersion string, components ...app.Component) (a *app.App, err error) {
|
||||
a = new(app.App)
|
||||
a.SetVersionName(appVersion(a, clientWithVersion))
|
||||
complexAppVersion := appVersion(a, clientWithVersion)
|
||||
a.SetVersionName(complexAppVersion)
|
||||
logging.SetVersion(complexAppVersion)
|
||||
Bootstrap(a, components...)
|
||||
metrics.SharedClient.SetAppVersion(a.Version())
|
||||
metrics.SharedClient.Run()
|
||||
|
@ -166,49 +167,18 @@ func Bootstrap(a *app.App, components ...app.Component) {
|
|||
for _, c := range components {
|
||||
a.Register(c)
|
||||
}
|
||||
walletService := a.Component(wallet.CName).(wallet.Wallet)
|
||||
eventService := a.Component(event.CName).(event.Sender)
|
||||
cfg := a.Component(config.CName).(*config.Config)
|
||||
|
||||
tempDirService := core.NewTempDirService(walletService)
|
||||
spaceService := space.New()
|
||||
sbtProvider := typeprovider.New(spaceService)
|
||||
objectStore := objectstore.New(sbtProvider)
|
||||
objectCreator := objectcreator.NewCreator(sbtProvider)
|
||||
layoutConverter := converter.NewLayoutConverter(objectStore, sbtProvider)
|
||||
blockService := block.New(tempDirService, sbtProvider, layoutConverter)
|
||||
collectionService := collection.New(blockService, objectStore)
|
||||
relationService := relation.New()
|
||||
coreService := core.New()
|
||||
graphRenderer := objectgraph.NewBuilder(sbtProvider, relationService, objectStore, coreService)
|
||||
fileSyncService := filesync.New(eventService)
|
||||
fileStore := filestore.New()
|
||||
|
||||
datastoreProvider := clientds.New()
|
||||
nodeConf := nodeconf.New()
|
||||
|
||||
const fileWatcherUpdateInterval = 5 * time.Second
|
||||
syncStatusService := syncstatus.New(
|
||||
sbtProvider,
|
||||
datastoreProvider,
|
||||
spaceService,
|
||||
coreService,
|
||||
fileSyncService,
|
||||
nodeConf,
|
||||
fileStore,
|
||||
blockService,
|
||||
cfg,
|
||||
eventService,
|
||||
fileWatcherUpdateInterval,
|
||||
)
|
||||
fileSyncService.OnUpload(syncStatusService.OnFileUpload)
|
||||
fileService := files.New(syncStatusService, objectStore)
|
||||
indexerService := indexer.New(blockService, spaceService, fileService)
|
||||
|
||||
a.Register(datastoreProvider).
|
||||
a.
|
||||
// Data storages
|
||||
Register(clientds.New()).
|
||||
Register(ftsearch.New()).
|
||||
Register(objectstore.New()).
|
||||
// Services
|
||||
Register(nodeconfsource.New()).
|
||||
Register(nodeconfstore.New()).
|
||||
Register(nodeConf).
|
||||
Register(nodeconf.New()).
|
||||
Register(peerstore.New()).
|
||||
Register(syncstatusprovider.New()).
|
||||
Register(storage.New()).
|
||||
|
@ -225,45 +195,45 @@ func Bootstrap(a *app.App, components ...app.Component) {
|
|||
Register(credentialprovider.New()).
|
||||
Register(commonspace.New()).
|
||||
Register(rpcstore.New()).
|
||||
Register(spaceService).
|
||||
Register(fileStore).
|
||||
Register(space.New()).
|
||||
Register(filestore.New()).
|
||||
Register(fileservice.New()).
|
||||
Register(filestorage.New(eventService)).
|
||||
Register(fileSyncService).
|
||||
Register(filestorage.New()).
|
||||
Register(filesync.New()).
|
||||
Register(localdiscovery.New()).
|
||||
Register(peermanager.New()).
|
||||
Register(sbtProvider).
|
||||
Register(relationService).
|
||||
Register(ftsearch.New()).
|
||||
Register(objectStore).
|
||||
Register(typeprovider.New()).
|
||||
Register(relation.New()).
|
||||
Register(converter.NewLayoutConverter()).
|
||||
Register(recordsbatcher.New()).
|
||||
Register(fileService).
|
||||
Register(files.New()).
|
||||
Register(configfetcher.New()).
|
||||
Register(process.New()).
|
||||
Register(source.New()).
|
||||
Register(coreService).
|
||||
Register(core.New()).
|
||||
Register(core.NewTempDirService()).
|
||||
Register(builtintemplate.New()).
|
||||
Register(blockService).
|
||||
Register(indexerService).
|
||||
Register(syncStatusService).
|
||||
Register(block.New()).
|
||||
Register(indexer.New()).
|
||||
Register(syncstatus.New(fileWatcherUpdateInterval)).
|
||||
Register(history.New()).
|
||||
Register(gateway.New()).
|
||||
Register(export.New(sbtProvider)).
|
||||
Register(export.New()).
|
||||
Register(linkpreview.New()).
|
||||
Register(unsplash.New(tempDirService)).
|
||||
Register(restriction.New(sbtProvider, objectStore)).
|
||||
Register(unsplash.New()).
|
||||
Register(restriction.New()).
|
||||
Register(debug.New()).
|
||||
Register(collectionService).
|
||||
Register(subscription.New(collectionService, sbtProvider)).
|
||||
Register(builtinobjects.New(tempDirService)).
|
||||
Register(bookmark.New(tempDirService)).
|
||||
Register(collection.New()).
|
||||
Register(subscription.New()).
|
||||
Register(builtinobjects.New()).
|
||||
Register(bookmark.New()).
|
||||
Register(session.New()).
|
||||
Register(importer.New(tempDirService, sbtProvider)).
|
||||
Register(importer.New()).
|
||||
Register(decorator.New()).
|
||||
Register(objectCreator).
|
||||
Register(objectcreator.NewCreator()).
|
||||
Register(kanban.New()).
|
||||
Register(editor.NewObjectFactory(tempDirService, sbtProvider, layoutConverter)).
|
||||
Register(graphRenderer).
|
||||
Register(editor.NewObjectFactory()).
|
||||
Register(objectgraph.NewBuilder()).
|
||||
Register(account.New())
|
||||
}
|
||||
|
||||
|
|
|
@ -61,12 +61,12 @@ type service struct {
|
|||
creator ObjectCreator
|
||||
store objectstore.ObjectStore
|
||||
linkPreview linkpreview.LinkPreview
|
||||
tempDirService *core.TempDirService
|
||||
tempDirService core.TempDirProvider
|
||||
fileService files.Service
|
||||
}
|
||||
|
||||
func New(tempDirService *core.TempDirService) Service {
|
||||
return &service{tempDirService: tempDirService}
|
||||
func New() Service {
|
||||
return &service{}
|
||||
}
|
||||
|
||||
func (s *service) Init(a *app.App) (err error) {
|
||||
|
@ -75,6 +75,7 @@ func (s *service) Init(a *app.App) (err error) {
|
|||
s.store = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
|
||||
s.linkPreview = a.MustComponent(linkpreview.CName).(linkpreview.LinkPreview)
|
||||
s.fileService = app.MustComponent[files.Service](a)
|
||||
s.tempDirService = app.MustComponent[core.TempDirProvider](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -33,19 +33,16 @@ type Service struct {
|
|||
objectStore objectstore.ObjectStore
|
||||
}
|
||||
|
||||
func New(
|
||||
picker block.Picker,
|
||||
store objectstore.ObjectStore,
|
||||
) *Service {
|
||||
func New() *Service {
|
||||
return &Service{
|
||||
picker: picker,
|
||||
objectStore: store,
|
||||
lock: &sync.RWMutex{},
|
||||
collections: map[string]map[string]chan []string{},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) Init(a *app.App) (err error) {
|
||||
s.picker = app.MustComponent[block.Picker](a)
|
||||
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -206,7 +203,10 @@ func (s *Service) ObjectToCollection(id string) error {
|
|||
return fmt.Errorf("invalid smartblock impmlementation: %T", b)
|
||||
}
|
||||
st := b.NewState()
|
||||
commonOperations.SetLayoutInState(st, model.ObjectType_collection)
|
||||
err := commonOperations.SetLayoutInStateAndIgnoreRestriction(st, model.ObjectType_collection)
|
||||
if err != nil {
|
||||
return fmt.Errorf("set layout: %w", err)
|
||||
}
|
||||
st.SetObjectType(bundle.TypeKeyCollection.URL())
|
||||
flags := internalflag.NewFromState(st)
|
||||
flags.Remove(model.InternalFlag_editorSelectType)
|
||||
|
|
|
@ -8,9 +8,11 @@ import (
|
|||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/anyproto/any-sync/app"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/template"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/mock_objectstore"
|
||||
"github.com/anyproto/anytype-heart/core/session"
|
||||
)
|
||||
|
||||
|
@ -22,13 +24,36 @@ func (t *testPicker) PickBlock(ctx context.Context, id string) (sb smartblock.Sm
|
|||
return t.sb, nil
|
||||
}
|
||||
|
||||
func (t *testPicker) Init(a *app.App) error { return nil }
|
||||
|
||||
func (t *testPicker) Name() string { return "" }
|
||||
|
||||
type fixture struct {
|
||||
picker *testPicker
|
||||
*Service
|
||||
}
|
||||
|
||||
func newFixture(t *testing.T) *fixture {
|
||||
picker := &testPicker{}
|
||||
a := &app.App{}
|
||||
objectStore := mock_objectstore.NewMockObjectStore(t)
|
||||
objectStore.EXPECT().Name().Return("objectStore")
|
||||
a.Register(picker)
|
||||
a.Register(objectStore)
|
||||
s := New()
|
||||
|
||||
err := s.Init(a)
|
||||
require.NoError(t, err)
|
||||
return &fixture{picker: picker, Service: s}
|
||||
}
|
||||
|
||||
func TestBroadcast(t *testing.T) {
|
||||
const collectionID = "collectionID"
|
||||
sb := smarttest.New(collectionID)
|
||||
ctx := session.NewContext()
|
||||
|
||||
picker := &testPicker{sb: sb}
|
||||
s := New(picker, nil)
|
||||
s := newFixture(t)
|
||||
s.picker.sb = sb
|
||||
|
||||
_, subCh1, err := s.SubscribeForCollection(ctx, collectionID, "sub1")
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -219,7 +219,10 @@ func (s *Service) ObjectToSet(ctx session.Context, id string, source []string) e
|
|||
}
|
||||
st := b.NewState()
|
||||
st.SetDetail(bundle.RelationKeySetOf.String(), pbtypes.StringList(source))
|
||||
commonOperations.SetLayoutInState(st, model.ObjectType_set)
|
||||
err := commonOperations.SetLayoutInStateAndIgnoreRestriction(st, model.ObjectType_set)
|
||||
if err != nil {
|
||||
return fmt.Errorf("set layout: %w", err)
|
||||
}
|
||||
st.SetObjectType(bundle.TypeKeySet.URL())
|
||||
flags := internalflag.NewFromState(st)
|
||||
flags.Remove(model.InternalFlag_editorSelectType)
|
||||
|
|
|
@ -57,6 +57,7 @@ type CommonOperations interface {
|
|||
SetObjectTypesInState(s *state.State, objectTypes []string) (err error)
|
||||
SetLayout(ctx session.Context, layout model.ObjectTypeLayout) (err error)
|
||||
SetLayoutInState(s *state.State, layout model.ObjectTypeLayout) (err error)
|
||||
SetLayoutInStateAndIgnoreRestriction(s *state.State, toLayout model.ObjectTypeLayout) (err error)
|
||||
}
|
||||
|
||||
type DetailsSettable interface {
|
||||
|
|
|
@ -38,7 +38,7 @@ func TestBasic_Create(t *testing.T) {
|
|||
t.Run("generic", func(t *testing.T) {
|
||||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
st := sb.NewState()
|
||||
id, err := b.CreateBlock(st, pb.RpcBlockCreateRequest{
|
||||
Block: &model.Block{Content: &model.BlockContentOfText{Text: &model.BlockContentText{Text: "ll"}}},
|
||||
|
@ -52,7 +52,7 @@ func TestBasic_Create(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
|
||||
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
s := sb.NewState()
|
||||
id, err := b.CreateBlock(s, pb.RpcBlockCreateRequest{
|
||||
TargetId: template.TitleBlockId,
|
||||
|
@ -73,7 +73,7 @@ func TestBasic_Create(t *testing.T) {
|
|||
}
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
|
||||
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
_, err := b.CreateBlock(sb.NewState(), pb.RpcBlockCreateRequest{})
|
||||
assert.ErrorIs(t, err, restriction.ErrRestricted)
|
||||
})
|
||||
|
@ -86,7 +86,7 @@ func TestBasic_Duplicate(t *testing.T) {
|
|||
AddBlock(simple.New(&model.Block{Id: "3"}))
|
||||
|
||||
st := sb.NewState()
|
||||
newIds, err := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil)).Duplicate(st, st, "", 0, []string{"2"})
|
||||
newIds, err := NewBasic(sb, nil, nil, converter.NewLayoutConverter()).Duplicate(st, st, "", 0, []string{"2"})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = sb.Apply(st)
|
||||
|
@ -105,7 +105,7 @@ func TestBasic_Unlink(t *testing.T) {
|
|||
AddBlock(simple.New(&model.Block{Id: "2", ChildrenIds: []string{"3"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "3"}))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
err := b.Unlink(nil, "2")
|
||||
require.NoError(t, err)
|
||||
|
@ -119,7 +119,7 @@ func TestBasic_Unlink(t *testing.T) {
|
|||
AddBlock(simple.New(&model.Block{Id: "2", ChildrenIds: []string{"3"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "3"}))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
err := b.Unlink(nil, "2", "3")
|
||||
require.NoError(t, err)
|
||||
|
@ -136,7 +136,7 @@ func TestBasic_Move(t *testing.T) {
|
|||
AddBlock(simple.New(&model.Block{Id: "3"})).
|
||||
AddBlock(simple.New(&model.Block{Id: "4"}))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
st := sb.NewState()
|
||||
|
||||
err := b.Move(st, st, "4", model.Block_Inner, []string{"3"})
|
||||
|
@ -150,7 +150,7 @@ func TestBasic_Move(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
|
||||
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
s := sb.NewState()
|
||||
id1, err := b.CreateBlock(s, pb.RpcBlockCreateRequest{
|
||||
TargetId: template.HeaderLayoutId,
|
||||
|
@ -180,7 +180,7 @@ func TestBasic_Move(t *testing.T) {
|
|||
AddBlock(newTextBlock("1", "", nil)).
|
||||
AddBlock(newTextBlock("2", "one", nil))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
st := sb.NewState()
|
||||
err := b.Move(st, st, "1", model.Block_InnerFirst, []string{"2"})
|
||||
require.NoError(t, err)
|
||||
|
@ -200,7 +200,7 @@ func TestBasic_Move(t *testing.T) {
|
|||
AddBlock(firstBlock).
|
||||
AddBlock(secondBlock)
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
st := sb.NewState()
|
||||
err := b.Move(st, st, "1", model.Block_InnerFirst, []string{"2"})
|
||||
require.NoError(t, err)
|
||||
|
@ -214,7 +214,7 @@ func TestBasic_Move(t *testing.T) {
|
|||
AddBlock(newTextBlock("1", "", nil)).
|
||||
AddBlock(newTextBlock("2", "one", nil))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
st := sb.NewState()
|
||||
err := b.Move(st, nil, "1", model.Block_Top, []string{"2"})
|
||||
require.NoError(t, err)
|
||||
|
@ -234,7 +234,7 @@ func TestBasic_MoveToAnotherObject(t *testing.T) {
|
|||
sb2 := smarttest.New("test2")
|
||||
sb2.AddBlock(simple.New(&model.Block{Id: "test2", ChildrenIds: []string{}}))
|
||||
|
||||
b := NewBasic(sb1, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb1, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
srcState := sb1.NewState()
|
||||
destState := sb2.NewState()
|
||||
|
@ -269,7 +269,7 @@ func TestBasic_Replace(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "2"}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
newId, err := b.Replace(nil, "2", &model.Block{Content: &model.BlockContentOfText{Text: &model.BlockContentText{Text: "l"}}})
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, newId)
|
||||
|
@ -279,7 +279,7 @@ func TestBasic_SetFields(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "2"}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
fields := &types.Struct{
|
||||
Fields: map[string]*types.Value{
|
||||
|
@ -298,7 +298,7 @@ func TestBasic_Update(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "2"}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
err := b.Update(nil, func(b simple.Block) error {
|
||||
b.Model().BackgroundColor = "test"
|
||||
|
@ -312,7 +312,7 @@ func TestBasic_SetDivStyle(t *testing.T) {
|
|||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
|
||||
AddBlock(simple.New(&model.Block{Id: "2", Content: &model.BlockContentOfDiv{Div: &model.BlockContentDiv{}}}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
|
||||
err := b.SetDivStyle(nil, model.BlockContentDiv_Dots, "2")
|
||||
require.NoError(t, err)
|
||||
|
@ -323,7 +323,7 @@ func TestBasic_SetDivStyle(t *testing.T) {
|
|||
func TestBasic_PasteBlocks(t *testing.T) {
|
||||
sb := smarttest.New("test")
|
||||
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
s := sb.NewState()
|
||||
err := b.PasteBlocks(s, "", model.Block_Inner, []simple.Block{
|
||||
simple.New(&model.Block{Id: "1", ChildrenIds: []string{"1.1"}}),
|
||||
|
@ -350,7 +350,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
|
|||
t.Run("correct", func(t *testing.T) {
|
||||
sb := smarttest.New("test")
|
||||
fillSb(sb)
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
err := b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
|
||||
BlockId: "2",
|
||||
Key: "testRelKey",
|
||||
|
@ -372,7 +372,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
|
|||
t.Run("not relation block", func(t *testing.T) {
|
||||
sb := smarttest.New("test")
|
||||
fillSb(sb)
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
require.Error(t, b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
|
||||
BlockId: "1",
|
||||
Key: "key",
|
||||
|
@ -381,7 +381,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
|
|||
t.Run("relation not found", func(t *testing.T) {
|
||||
sb := smarttest.New("test")
|
||||
fillSb(sb)
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
require.Error(t, b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
|
||||
BlockId: "2",
|
||||
Key: "not exists",
|
||||
|
@ -397,7 +397,7 @@ func TestBasic_FeaturedRelationAdd(t *testing.T) {
|
|||
s.AddBundledRelations(bundle.RelationKeyDescription)
|
||||
require.NoError(t, sb.Apply(s))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
newRel := []string{bundle.RelationKeyDescription.String(), bundle.RelationKeyName.String()}
|
||||
require.NoError(t, b.FeaturedRelationAdd(nil, newRel...))
|
||||
|
||||
|
@ -413,7 +413,7 @@ func TestBasic_FeaturedRelationRemove(t *testing.T) {
|
|||
template.WithDescription(s)
|
||||
require.NoError(t, sb.Apply(s))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
require.NoError(t, b.FeaturedRelationRemove(nil, bundle.RelationKeyDescription.String()))
|
||||
|
||||
res := sb.NewState()
|
||||
|
@ -450,7 +450,7 @@ func TestBasic_ReplaceLink(t *testing.T) {
|
|||
}
|
||||
require.NoError(t, sb.Apply(s))
|
||||
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
|
||||
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
|
||||
require.NoError(t, b.ReplaceLink(oldId, newId))
|
||||
|
||||
res := sb.NewState()
|
||||
|
|
|
@ -218,6 +218,10 @@ func (bs *basic) SetLayoutInState(s *state.State, toLayout model.ObjectTypeLayou
|
|||
return fmt.Errorf("layout change is restricted for object '%s': %v", bs.Id(), err)
|
||||
}
|
||||
|
||||
return bs.SetLayoutInStateAndIgnoreRestriction(s, toLayout)
|
||||
}
|
||||
|
||||
func (bs *basic) SetLayoutInStateAndIgnoreRestriction(s *state.State, toLayout model.ObjectTypeLayout) (err error) {
|
||||
fromLayout, _ := s.Layout()
|
||||
|
||||
s.SetDetail(bundle.RelationKeyLayout.String(), pbtypes.Int64(int64(toLayout)))
|
||||
|
|
|
@ -192,7 +192,7 @@ func TestExtractObjects(t *testing.T) {
|
|||
ObjectType: bundle.TypeKeyNote.URL(),
|
||||
}
|
||||
ctx := session.NewContext()
|
||||
linkIds, err := NewBasic(sb, fixture.store, nil, converter.NewLayoutConverter(nil, nil)).ExtractBlocksToObjects(ctx, ts, req)
|
||||
linkIds, err := NewBasic(sb, fixture.store, nil, converter.NewLayoutConverter()).ExtractBlocksToObjects(ctx, ts, req)
|
||||
assert.NoError(t, err)
|
||||
|
||||
var gotBlockIds []string
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"golang.org/x/exp/slices"
|
||||
|
||||
"github.com/anyproto/any-sync/app"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/dataview"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/state"
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/template"
|
||||
|
@ -22,19 +23,31 @@ import (
|
|||
|
||||
const DefaultSetSource = bundle.TypeKeyPage
|
||||
|
||||
type LayoutConverter struct {
|
||||
type LayoutConverter interface {
|
||||
Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error
|
||||
app.Component
|
||||
}
|
||||
|
||||
type layoutConverter struct {
|
||||
objectStore objectstore.ObjectStore
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider
|
||||
}
|
||||
|
||||
func NewLayoutConverter(objectStore objectstore.ObjectStore, sbtProvider typeprovider.SmartBlockTypeProvider) LayoutConverter {
|
||||
return LayoutConverter{
|
||||
objectStore: objectStore,
|
||||
sbtProvider: sbtProvider,
|
||||
}
|
||||
func NewLayoutConverter() LayoutConverter {
|
||||
return &layoutConverter{}
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
|
||||
func (c *layoutConverter) Init(a *app.App) error {
|
||||
c.objectStore = app.MustComponent[objectstore.ObjectStore](a)
|
||||
c.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *layoutConverter) Name() string {
|
||||
return "layout-converter"
|
||||
}
|
||||
|
||||
func (c *layoutConverter) Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
|
||||
if fromLayout == toLayout {
|
||||
return nil
|
||||
}
|
||||
|
@ -78,7 +91,7 @@ func (c *LayoutConverter) Convert(st *state.State, fromLayout, toLayout model.Ob
|
|||
return c.fromAnyToAny(st)
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToAny(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToAny(st *state.State) error {
|
||||
template.InitTemplate(st,
|
||||
template.WithTitle,
|
||||
template.WithDescription,
|
||||
|
@ -86,7 +99,7 @@ func (c *LayoutConverter) fromAnyToAny(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToBookmark(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToBookmark(st *state.State) error {
|
||||
template.InitTemplate(st,
|
||||
template.WithTitle,
|
||||
template.WithDescription,
|
||||
|
@ -95,7 +108,7 @@ func (c *LayoutConverter) fromAnyToBookmark(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToTodo(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToTodo(st *state.State) error {
|
||||
if err := st.SetAlign(model.Block_AlignLeft); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -107,7 +120,7 @@ func (c *LayoutConverter) fromAnyToTodo(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromNoteToSet(st *state.State) error {
|
||||
func (c *layoutConverter) fromNoteToSet(st *state.State) error {
|
||||
if err := c.fromNoteToAny(st); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -123,7 +136,7 @@ func (c *LayoutConverter) fromNoteToSet(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToSet(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToSet(st *state.State) error {
|
||||
source := pbtypes.GetStringList(st.Details(), bundle.RelationKeySetOf.String())
|
||||
if len(source) == 0 {
|
||||
source = []string{DefaultSetSource.URL()}
|
||||
|
@ -147,7 +160,7 @@ func addFeaturedRelationSetOf(st *state.State) {
|
|||
st.SetDetail(bundle.RelationKeyFeaturedRelations.String(), pbtypes.StringList(fr))
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromSetToCollection(st *state.State) error {
|
||||
func (c *layoutConverter) fromSetToCollection(st *state.State) error {
|
||||
dvBlock := st.Get(template.DataviewBlockId)
|
||||
if dvBlock == nil {
|
||||
return fmt.Errorf("dataview block is not found")
|
||||
|
@ -167,7 +180,7 @@ func (c *LayoutConverter) fromSetToCollection(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error) {
|
||||
func (c *layoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error) {
|
||||
records, _, err := c.objectStore.Query(
|
||||
nil,
|
||||
database.Query{
|
||||
|
@ -184,7 +197,7 @@ func (c *LayoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error
|
|||
return ids, nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromNoteToCollection(st *state.State) error {
|
||||
func (c *layoutConverter) fromNoteToCollection(st *state.State) error {
|
||||
if err := c.fromNoteToAny(st); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -197,13 +210,13 @@ func (c *LayoutConverter) fromNoteToCollection(st *state.State) error {
|
|||
return c.fromAnyToCollection(st)
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToCollection(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToCollection(st *state.State) error {
|
||||
blockContent := template.MakeCollectionDataviewContent()
|
||||
template.InitTemplate(st, template.WithDataview(*blockContent, false))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromNoteToAny(st *state.State) error {
|
||||
func (c *layoutConverter) fromNoteToAny(st *state.State) error {
|
||||
name, ok := st.Details().Fields[bundle.RelationKeyName.String()]
|
||||
|
||||
if !ok || name.GetStringValue() == "" {
|
||||
|
@ -228,7 +241,7 @@ func (c *LayoutConverter) fromNoteToAny(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) fromAnyToNote(st *state.State) error {
|
||||
func (c *layoutConverter) fromAnyToNote(st *state.State) error {
|
||||
template.InitTemplate(st,
|
||||
template.WithNameToFirstBlock,
|
||||
template.WithNoTitle,
|
||||
|
@ -237,7 +250,7 @@ func (c *LayoutConverter) fromAnyToNote(st *state.State) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *LayoutConverter) removeRelationSetOf(st *state.State) {
|
||||
func (c *layoutConverter) removeRelationSetOf(st *state.State) {
|
||||
st.RemoveDetail(bundle.RelationKeySetOf.String())
|
||||
|
||||
fr := pbtypes.GetStringList(st.Details(), bundle.RelationKeyFeaturedRelations.String())
|
||||
|
|
|
@ -47,16 +47,8 @@ type ObjectFactory struct {
|
|||
subObjectFactory subObjectFactory
|
||||
}
|
||||
|
||||
func NewObjectFactory(
|
||||
tempDirProvider core.TempDirProvider,
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider,
|
||||
layoutConverter converter.LayoutConverter,
|
||||
) *ObjectFactory {
|
||||
return &ObjectFactory{
|
||||
tempDirProvider: tempDirProvider,
|
||||
sbtProvider: sbtProvider,
|
||||
layoutConverter: layoutConverter,
|
||||
}
|
||||
func NewObjectFactory() *ObjectFactory {
|
||||
return &ObjectFactory{}
|
||||
}
|
||||
|
||||
func (f *ObjectFactory) Init(a *app.App) (err error) {
|
||||
|
@ -70,6 +62,9 @@ func (f *ObjectFactory) Init(a *app.App) (err error) {
|
|||
f.templateCloner = app.MustComponent[templateCloner](a)
|
||||
f.fileService = app.MustComponent[files.Service](a)
|
||||
f.config = app.MustComponent[*config.Config](a)
|
||||
f.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
|
||||
f.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
f.layoutConverter = app.MustComponent[converter.LayoutConverter](a)
|
||||
f.picker = app.MustComponent[getblock.Picker](a)
|
||||
f.eventSender = app.MustComponent[event.Sender](a)
|
||||
f.subObjectFactory = subObjectFactory{
|
||||
|
|
|
@ -9,10 +9,10 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/magiconair/properties/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/file"
|
||||
"github.com/anyproto/anytype-heart/core/block/getblock/mock_getblock"
|
||||
|
@ -169,7 +169,7 @@ func newFixture(t *testing.T) *uplFixture {
|
|||
fx.fileService = testMock.NewMockFileService(fx.ctrl)
|
||||
fx.blockService = NewMockBlockService(fx.ctrl)
|
||||
|
||||
fx.Uploader = file.NewUploader("space1", fx.blockService, fx.fileService, core.NewTempDirService(nil), picker)
|
||||
fx.Uploader = file.NewUploader("space1", fx.blockService, fx.fileService, core.NewTempDirService(), picker)
|
||||
fx.file = testMock.NewMockFile(fx.ctrl)
|
||||
fx.file.EXPECT().Hash().Return("123").AnyTimes()
|
||||
return fx
|
||||
|
|
|
@ -4,13 +4,12 @@ import (
|
|||
"context"
|
||||
"testing"
|
||||
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/block/editor/state"
|
||||
"github.com/anyproto/anytype-heart/core/block/restriction"
|
||||
"github.com/anyproto/anytype-heart/core/block/simple"
|
||||
"github.com/anyproto/anytype-heart/core/event/mock_event"
|
||||
"github.com/anyproto/anytype-heart/core/session"
|
||||
|
@ -25,9 +24,12 @@ import (
|
|||
"github.com/anyproto/anytype-heart/util/testMock/mockRelation"
|
||||
"github.com/anyproto/anytype-heart/util/testMock/mockSource"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/block/restriction"
|
||||
"github.com/anyproto/anytype-heart/core/block/restriction/mock_restriction"
|
||||
_ "github.com/anyproto/anytype-heart/core/block/simple/base"
|
||||
_ "github.com/anyproto/anytype-heart/core/block/simple/link"
|
||||
_ "github.com/anyproto/anytype-heart/core/block/simple/text"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
func TestSmartBlock_Init(t *testing.T) {
|
||||
|
@ -128,7 +130,8 @@ func newFixture(t *testing.T) *fixture {
|
|||
indexer := NewMockIndexer(ctrl)
|
||||
indexer.EXPECT().Name().Return("indexer").AnyTimes()
|
||||
|
||||
restrictionService := restriction.New(nil, objectStore)
|
||||
restrictionService := mock_restriction.NewMockService(t)
|
||||
restrictionService.EXPECT().GetRestrictions(mock.Anything).Return(restriction.Restrictions{})
|
||||
relationService := mockRelation.NewMockService(ctrl)
|
||||
|
||||
fileService := testMock.NewMockFileService(ctrl)
|
||||
|
|
|
@ -56,26 +56,25 @@ type Export interface {
|
|||
}
|
||||
|
||||
type export struct {
|
||||
bs *block.Service
|
||||
blockService *block.Service
|
||||
picker getblock.Picker
|
||||
objectStore objectstore.ObjectStore
|
||||
a core.Service
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider
|
||||
fileService files.Service
|
||||
objectStore objectstore.ObjectStore
|
||||
coreService core.Service
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider
|
||||
fileService files.Service
|
||||
}
|
||||
|
||||
func New(sbtProvider typeprovider.SmartBlockTypeProvider) Export {
|
||||
return &export{
|
||||
sbtProvider: sbtProvider,
|
||||
}
|
||||
func New() Export {
|
||||
return &export{}
|
||||
}
|
||||
|
||||
func (e *export) Init(a *app.App) (err error) {
|
||||
e.bs = a.MustComponent(block.CName).(*block.Service)
|
||||
e.a = a.MustComponent(core.CName).(core.Service)
|
||||
e.blockService = a.MustComponent(block.CName).(*block.Service)
|
||||
e.coreService = a.MustComponent(core.CName).(core.Service)
|
||||
e.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
|
||||
e.fileService = app.MustComponent[files.Service](a)
|
||||
e.picker = app.MustComponent[getblock.Picker](a)
|
||||
e.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -84,7 +83,7 @@ func (e *export) Name() (name string) {
|
|||
}
|
||||
|
||||
func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest) (path string, succeed int, err error) {
|
||||
queue := e.bs.Process().NewQueue(pb.ModelProcess{
|
||||
queue := e.blockService.Process().NewQueue(pb.ModelProcess{
|
||||
Id: bson.NewObjectId().Hex(),
|
||||
Type: pb.ModelProcess_Export,
|
||||
State: 0,
|
||||
|
@ -324,7 +323,7 @@ func (e *export) writeDoc(ctx context.Context, format pb.RpcObjectListExportForm
|
|||
var conv converter.Converter
|
||||
switch format {
|
||||
case pb.RpcObjectListExport_Markdown:
|
||||
conv = md.NewMDConverter(e.a, b.NewState(), wr.Namer())
|
||||
conv = md.NewMDConverter(e.coreService, b.NewState(), wr.Namer())
|
||||
case pb.RpcObjectListExport_Protobuf:
|
||||
conv = pbc.NewConverter(b, isJSON)
|
||||
case pb.RpcObjectListExport_JSON:
|
||||
|
@ -341,7 +340,7 @@ func (e *export) writeDoc(ctx context.Context, format pb.RpcObjectListExportForm
|
|||
}
|
||||
filename = wr.Namer().Get("", docID, name, conv.Ext())
|
||||
}
|
||||
if docID == e.a.PredefinedObjects(b.SpaceID()).Home {
|
||||
if docID == e.coreService.PredefinedObjects(b.SpaceID()).Home {
|
||||
filename = "index" + conv.Ext()
|
||||
}
|
||||
if err = wr.WriteFile(filename, bytes.NewReader(result)); err != nil {
|
||||
|
@ -403,18 +402,18 @@ func (e *export) saveFile(ctx context.Context, wr writer, hash string) (err erro
|
|||
|
||||
func (e *export) createProfileFile(spaceID string, wr writer) error {
|
||||
var spaceDashBoardID string
|
||||
pr, err := e.a.LocalProfile(spaceID)
|
||||
pr, err := e.coreService.LocalProfile(spaceID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = getblock.Do(e.picker, e.a.PredefinedObjects(spaceID).Account, func(b sb.SmartBlock) error {
|
||||
err = getblock.Do(e.picker, e.coreService.PredefinedObjects(spaceID).Account, func(b sb.SmartBlock) error {
|
||||
spaceDashBoardID = pbtypes.GetString(b.CombinedDetails(), bundle.RelationKeySpaceDashboardId.String())
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
profileID := e.a.ProfileID(spaceID)
|
||||
profileID := e.coreService.ProfileID(spaceID)
|
||||
profile := &pb.Profile{
|
||||
SpaceDashboardId: spaceDashBoardID,
|
||||
Address: pr.AccountAddr,
|
||||
|
|
|
@ -54,14 +54,9 @@ type Import struct {
|
|||
sbtProvider typeprovider.SmartBlockTypeProvider
|
||||
}
|
||||
|
||||
func New(
|
||||
tempDirProvider core.TempDirProvider,
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider,
|
||||
) Importer {
|
||||
func New() Importer {
|
||||
return &Import{
|
||||
tempDirProvider: tempDirProvider,
|
||||
sbtProvider: sbtProvider,
|
||||
converters: make(map[string]converter.Converter, 0),
|
||||
converters: make(map[string]converter.Converter, 0),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,6 +84,8 @@ func (i *Import) Init(a *app.App) (err error) {
|
|||
fileStore := app.MustComponent[filestore.FileStore](a)
|
||||
relationSyncer := syncer.NewFileRelationSyncer(i.s, fileStore)
|
||||
i.oc = NewCreator(i.s, coreService, factory, store, relationSyncer, fileStore, picker)
|
||||
i.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
|
||||
i.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -4,12 +4,16 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/samber/lo"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/block/collection"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/converter"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/block"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/client"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/database"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/page"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/property"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/search"
|
||||
"github.com/anyproto/anytype-heart/core/block/process"
|
||||
"github.com/anyproto/anytype-heart/pb"
|
||||
|
@ -65,7 +69,8 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques
|
|||
return nil, ce
|
||||
}
|
||||
logger.With("pages", len(pages)).With("dbs", len(db)).Warnf("import from notion started")
|
||||
progress.SetTotal(int64(len(db)*numberOfStepsForDatabases+len(pages)*numberOfStepsForPages) + stepForSearch)
|
||||
allProperties := n.getUniqueProperties(db, pages)
|
||||
progress.SetTotal(int64(len(db)*numberOfStepsForDatabases+len(pages)*numberOfStepsForPages+len(allProperties)) + stepForSearch)
|
||||
|
||||
if err = progress.TryStep(1); err != nil {
|
||||
return nil, converter.NewFromError(converter.ErrCancel)
|
||||
|
@ -139,6 +144,22 @@ func (n *Notion) GetSnapshots(ctx context.Context, req *pb.RpcObjectImportReques
|
|||
return &converter.Response{Snapshots: allSnapshots}, nil
|
||||
}
|
||||
|
||||
func (n *Notion) getUniqueProperties(db []database.Database, pages []page.Page) []string {
|
||||
var allProperties []string
|
||||
for _, d := range db {
|
||||
keys := lo.MapToSlice(d.Properties, func(key string, value property.DatabasePropertyHandler) string { return key })
|
||||
uniqueKeys := lo.Filter(keys, func(item string, index int) bool { return !lo.Contains(allProperties, item) })
|
||||
allProperties = append(allProperties, uniqueKeys...)
|
||||
}
|
||||
|
||||
for _, pg := range pages {
|
||||
keys := lo.MapToSlice(pg.Properties, func(key string, value property.Object) string { return key })
|
||||
uniqueKeys := lo.Filter(keys, func(item string, index int) bool { return !lo.Contains(allProperties, item) })
|
||||
allProperties = append(allProperties, uniqueKeys...)
|
||||
}
|
||||
return allProperties
|
||||
}
|
||||
|
||||
func (n *Notion) getParams(param *pb.RpcObjectImportRequest) string {
|
||||
if p := param.GetNotionParams(); p != nil {
|
||||
return p.GetApiKey()
|
||||
|
|
89
core/block/import/notion/converter_test.go
Normal file
89
core/block/import/notion/converter_test.go
Normal file
|
@ -0,0 +1,89 @@
|
|||
package notion
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/database"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/page"
|
||||
"github.com/anyproto/anytype-heart/core/block/import/notion/api/property"
|
||||
)
|
||||
|
||||
func TestNotion_getUniqueProperties(t *testing.T) {
|
||||
t.Run("Page and Database have the same property - 1 unique item", func(t *testing.T) {
|
||||
// given
|
||||
converter := &Notion{}
|
||||
|
||||
databases := []database.Database{
|
||||
{
|
||||
Properties: map[string]property.DatabasePropertyHandler{
|
||||
"Name": &property.DatabaseTitle{},
|
||||
},
|
||||
},
|
||||
}
|
||||
pages := []page.Page{
|
||||
{
|
||||
Properties: map[string]property.Object{
|
||||
"Name": &property.TitleItem{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// when
|
||||
properties := converter.getUniqueProperties(databases, pages)
|
||||
|
||||
// then
|
||||
assert.Len(t, properties, 1)
|
||||
})
|
||||
t.Run("Page and Database have the different properties - 2 unique item", func(t *testing.T) {
|
||||
// given
|
||||
converter := &Notion{}
|
||||
db := []database.Database{
|
||||
{
|
||||
Properties: map[string]property.DatabasePropertyHandler{
|
||||
"Name": &property.DatabaseTitle{},
|
||||
},
|
||||
},
|
||||
}
|
||||
pages := []page.Page{
|
||||
{
|
||||
Properties: map[string]property.Object{
|
||||
"Name1": &property.TitleItem{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// when
|
||||
properties := converter.getUniqueProperties(db, pages)
|
||||
|
||||
// then
|
||||
assert.Len(t, properties, 2)
|
||||
})
|
||||
t.Run("Page and Database have the 2 different properties and 1 same property - 3 unique item", func(t *testing.T) {
|
||||
// given
|
||||
converter := &Notion{}
|
||||
databases := []database.Database{
|
||||
{
|
||||
Properties: map[string]property.DatabasePropertyHandler{
|
||||
"Name": &property.DatabaseTitle{},
|
||||
"Name 1": &property.DatabaseTitle{},
|
||||
},
|
||||
},
|
||||
}
|
||||
pages := []page.Page{
|
||||
{
|
||||
Properties: map[string]property.Object{
|
||||
"Name": &property.TitleItem{},
|
||||
"Name 2": &property.TitleItem{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// when
|
||||
properties := converter.getUniqueProperties(databases, pages)
|
||||
|
||||
// then
|
||||
assert.Len(t, properties, 3)
|
||||
})
|
||||
}
|
|
@ -60,21 +60,18 @@ type Creator struct {
|
|||
creator Service //nolint:unused
|
||||
|
||||
// TODO: remove it?
|
||||
anytype core.Service
|
||||
coreService core.Service
|
||||
}
|
||||
|
||||
type CollectionService interface {
|
||||
CreateCollection(details *types.Struct, flags []*model.InternalFlag) (coresb.SmartBlockType, *types.Struct, *state.State, error)
|
||||
}
|
||||
|
||||
func NewCreator(sbtProvider typeprovider.SmartBlockTypeProvider) Service {
|
||||
return &Creator{
|
||||
sbtProvider: sbtProvider,
|
||||
}
|
||||
func NewCreator() *Creator {
|
||||
return &Creator{}
|
||||
}
|
||||
|
||||
func (c *Creator) Init(a *app.App) (err error) {
|
||||
c.anytype = a.MustComponent(core.CName).(core.Service)
|
||||
c.blockService = a.MustComponent(block.CName).(BlockService)
|
||||
c.blockPicker = a.MustComponent(block.CName).(block.Picker)
|
||||
c.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
|
||||
|
@ -82,7 +79,8 @@ func (c *Creator) Init(a *app.App) (err error) {
|
|||
c.bookmark = a.MustComponent(bookmark.CName).(bookmark.Service)
|
||||
c.objectFactory = app.MustComponent[*editor.ObjectFactory](a)
|
||||
c.collectionService = app.MustComponent[CollectionService](a)
|
||||
c.anytype = a.MustComponent(core.CName).(core.Service)
|
||||
c.coreService = app.MustComponent[core.Service](a)
|
||||
c.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
c.app = a
|
||||
return nil
|
||||
}
|
||||
|
@ -155,14 +153,14 @@ func (c *Creator) CreateSmartBlockFromState(ctx context.Context, spaceID string,
|
|||
|
||||
// if we don't have anything in details then check the object store
|
||||
if workspaceID == "" {
|
||||
workspaceID = c.anytype.PredefinedObjects(spaceID).Account
|
||||
workspaceID = c.coreService.PredefinedObjects(spaceID).Account
|
||||
}
|
||||
|
||||
if workspaceID != "" {
|
||||
createState.SetDetailAndBundledRelation(bundle.RelationKeyWorkspaceId, pbtypes.String(workspaceID))
|
||||
}
|
||||
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreatedDate, pbtypes.Int64(time.Now().Unix()))
|
||||
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreator, pbtypes.String(c.anytype.ProfileID(spaceID)))
|
||||
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreator, pbtypes.String(c.coreService.ProfileID(spaceID)))
|
||||
|
||||
ev := &metrics.CreateObjectEvent{
|
||||
SetDetailsMs: time.Since(startTime).Milliseconds(),
|
||||
|
@ -197,7 +195,7 @@ func (c *Creator) CreateSmartBlockFromState(ctx context.Context, spaceID string,
|
|||
}
|
||||
|
||||
func (c *Creator) InjectWorkspaceID(details *types.Struct, spaceID string, objectID string) {
|
||||
workspaceID, err := c.anytype.GetWorkspaceIdForObject(spaceID, objectID)
|
||||
workspaceID, err := c.coreService.GetWorkspaceIdForObject(spaceID, objectID)
|
||||
if err != nil {
|
||||
workspaceID = ""
|
||||
}
|
||||
|
@ -267,7 +265,7 @@ func (c *Creator) CreateSubObjectInWorkspace(ctx context.Context, details *types
|
|||
|
||||
// TODO: it must be in another component
|
||||
func (c *Creator) CreateSubObjectsInWorkspace(ctx context.Context, spaceID string, details []*types.Struct) (ids []string, objects []*types.Struct, err error) {
|
||||
err = block.Do(c.blockPicker, c.anytype.PredefinedObjects(spaceID).Account, func(b smartblock.SmartBlock) error {
|
||||
err = block.Do(c.blockPicker, c.coreService.PredefinedObjects(spaceID).Account, func(b smartblock.SmartBlock) error {
|
||||
workspace, ok := b.(*editor.Workspaces)
|
||||
if !ok {
|
||||
return fmt.Errorf("incorrect object with workspace id")
|
||||
|
@ -347,15 +345,15 @@ func (c *Creator) CreateObject(ctx context.Context, spaceID string, req block.De
|
|||
return c.CreateSmartBlockFromState(ctx, spaceID, sbType, details, st)
|
||||
case bundle.TypeKeyObjectType.URL():
|
||||
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_objectType))
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.anytype.PredefinedObjects(spaceID).Account)
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.coreService.PredefinedObjects(spaceID).Account)
|
||||
|
||||
case bundle.TypeKeyRelation.URL():
|
||||
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relation))
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.anytype.PredefinedObjects(spaceID).Account)
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.coreService.PredefinedObjects(spaceID).Account)
|
||||
|
||||
case bundle.TypeKeyRelationOption.URL():
|
||||
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relationOption))
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.anytype.PredefinedObjects(spaceID).Account)
|
||||
return c.CreateSubObjectInWorkspace(ctx, details, c.coreService.PredefinedObjects(spaceID).Account)
|
||||
|
||||
case bundle.TypeKeyTemplate.URL():
|
||||
sbType = coresb.SmartBlockTypeTemplate
|
||||
|
|
|
@ -44,21 +44,15 @@ type Builder struct {
|
|||
*app.App
|
||||
}
|
||||
|
||||
func NewBuilder(
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider,
|
||||
relationService relation.Service,
|
||||
objectStore objectstore.ObjectStore,
|
||||
coreService core.Service,
|
||||
) *Builder {
|
||||
return &Builder{
|
||||
sbtProvider: sbtProvider,
|
||||
relationService: relationService,
|
||||
objectStore: objectStore,
|
||||
coreService: coreService,
|
||||
}
|
||||
func NewBuilder() *Builder {
|
||||
return &Builder{}
|
||||
}
|
||||
|
||||
func (gr *Builder) Init(a *app.App) (err error) {
|
||||
gr.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
gr.relationService = app.MustComponent[relation.Service](a)
|
||||
gr.objectStore = app.MustComponent[objectstore.ObjectStore](a)
|
||||
gr.coreService = app.MustComponent[core.Service](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
)
|
||||
|
||||
func TestService_DataviewRestrictions(t *testing.T) {
|
||||
rest := New(nil, nil)
|
||||
rest := New()
|
||||
assert.True(t, rest.GetRestrictions(&restrictionHolder{
|
||||
id: bundle.TypeKeyAudio.URL(),
|
||||
tp: model.SmartBlockType_SubObject,
|
||||
|
|
222
core/block/restriction/mock_restriction/mock_Service.go
Normal file
222
core/block/restriction/mock_restriction/mock_Service.go
Normal file
|
@ -0,0 +1,222 @@
|
|||
// Code generated by mockery v2.26.1. DO NOT EDIT.
|
||||
|
||||
package mock_restriction
|
||||
|
||||
import (
|
||||
app "github.com/anyproto/any-sync/app"
|
||||
mock "github.com/stretchr/testify/mock"
|
||||
|
||||
model "github.com/anyproto/anytype-heart/pkg/lib/pb/model"
|
||||
|
||||
restriction "github.com/anyproto/anytype-heart/core/block/restriction"
|
||||
)
|
||||
|
||||
// MockService is an autogenerated mock type for the Service type
|
||||
type MockService struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
type MockService_Expecter struct {
|
||||
mock *mock.Mock
|
||||
}
|
||||
|
||||
func (_m *MockService) EXPECT() *MockService_Expecter {
|
||||
return &MockService_Expecter{mock: &_m.Mock}
|
||||
}
|
||||
|
||||
// CheckRestrictions provides a mock function with given fields: id, cr
|
||||
func (_m *MockService) CheckRestrictions(id string, cr ...model.RestrictionsObjectRestriction) error {
|
||||
_va := make([]interface{}, len(cr))
|
||||
for _i := range cr {
|
||||
_va[_i] = cr[_i]
|
||||
}
|
||||
var _ca []interface{}
|
||||
_ca = append(_ca, id)
|
||||
_ca = append(_ca, _va...)
|
||||
ret := _m.Called(_ca...)
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func(string, ...model.RestrictionsObjectRestriction) error); ok {
|
||||
r0 = rf(id, cr...)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// MockService_CheckRestrictions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckRestrictions'
|
||||
type MockService_CheckRestrictions_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// CheckRestrictions is a helper method to define mock.On call
|
||||
// - id string
|
||||
// - cr ...model.RestrictionsObjectRestriction
|
||||
func (_e *MockService_Expecter) CheckRestrictions(id interface{}, cr ...interface{}) *MockService_CheckRestrictions_Call {
|
||||
return &MockService_CheckRestrictions_Call{Call: _e.mock.On("CheckRestrictions",
|
||||
append([]interface{}{id}, cr...)...)}
|
||||
}
|
||||
|
||||
func (_c *MockService_CheckRestrictions_Call) Run(run func(id string, cr ...model.RestrictionsObjectRestriction)) *MockService_CheckRestrictions_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
variadicArgs := make([]model.RestrictionsObjectRestriction, len(args)-1)
|
||||
for i, a := range args[1:] {
|
||||
if a != nil {
|
||||
variadicArgs[i] = a.(model.RestrictionsObjectRestriction)
|
||||
}
|
||||
}
|
||||
run(args[0].(string), variadicArgs...)
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_CheckRestrictions_Call) Return(_a0 error) *MockService_CheckRestrictions_Call {
|
||||
_c.Call.Return(_a0)
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_CheckRestrictions_Call) RunAndReturn(run func(string, ...model.RestrictionsObjectRestriction) error) *MockService_CheckRestrictions_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// GetRestrictions provides a mock function with given fields: _a0
|
||||
func (_m *MockService) GetRestrictions(_a0 restriction.RestrictionHolder) restriction.Restrictions {
|
||||
ret := _m.Called(_a0)
|
||||
|
||||
var r0 restriction.Restrictions
|
||||
if rf, ok := ret.Get(0).(func(restriction.RestrictionHolder) restriction.Restrictions); ok {
|
||||
r0 = rf(_a0)
|
||||
} else {
|
||||
r0 = ret.Get(0).(restriction.Restrictions)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// MockService_GetRestrictions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRestrictions'
|
||||
type MockService_GetRestrictions_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// GetRestrictions is a helper method to define mock.On call
|
||||
// - _a0 restriction.RestrictionHolder
|
||||
func (_e *MockService_Expecter) GetRestrictions(_a0 interface{}) *MockService_GetRestrictions_Call {
|
||||
return &MockService_GetRestrictions_Call{Call: _e.mock.On("GetRestrictions", _a0)}
|
||||
}
|
||||
|
||||
func (_c *MockService_GetRestrictions_Call) Run(run func(_a0 restriction.RestrictionHolder)) *MockService_GetRestrictions_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(restriction.RestrictionHolder))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_GetRestrictions_Call) Return(_a0 restriction.Restrictions) *MockService_GetRestrictions_Call {
|
||||
_c.Call.Return(_a0)
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_GetRestrictions_Call) RunAndReturn(run func(restriction.RestrictionHolder) restriction.Restrictions) *MockService_GetRestrictions_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// Init provides a mock function with given fields: a
|
||||
func (_m *MockService) Init(a *app.App) error {
|
||||
ret := _m.Called(a)
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
|
||||
r0 = rf(a)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// MockService_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
|
||||
type MockService_Init_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// Init is a helper method to define mock.On call
|
||||
// - a *app.App
|
||||
func (_e *MockService_Expecter) Init(a interface{}) *MockService_Init_Call {
|
||||
return &MockService_Init_Call{Call: _e.mock.On("Init", a)}
|
||||
}
|
||||
|
||||
func (_c *MockService_Init_Call) Run(run func(a *app.App)) *MockService_Init_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(*app.App))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_Init_Call) Return(err error) *MockService_Init_Call {
|
||||
_c.Call.Return(err)
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_Init_Call) RunAndReturn(run func(*app.App) error) *MockService_Init_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// Name provides a mock function with given fields:
|
||||
func (_m *MockService) Name() string {
|
||||
ret := _m.Called()
|
||||
|
||||
var r0 string
|
||||
if rf, ok := ret.Get(0).(func() string); ok {
|
||||
r0 = rf()
|
||||
} else {
|
||||
r0 = ret.Get(0).(string)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// MockService_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
|
||||
type MockService_Name_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// Name is a helper method to define mock.On call
|
||||
func (_e *MockService_Expecter) Name() *MockService_Name_Call {
|
||||
return &MockService_Name_Call{Call: _e.mock.On("Name")}
|
||||
}
|
||||
|
||||
func (_c *MockService_Name_Call) Run(run func()) *MockService_Name_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run()
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_Name_Call) Return(name string) *MockService_Name_Call {
|
||||
_c.Call.Return(name)
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockService_Name_Call) RunAndReturn(run func() string) *MockService_Name_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
type mockConstructorTestingTNewMockService interface {
|
||||
mock.TestingT
|
||||
Cleanup(func())
|
||||
}
|
||||
|
||||
// NewMockService creates a new instance of MockService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||
func NewMockService(t mockConstructorTestingTNewMockService) *MockService {
|
||||
mock := &MockService{}
|
||||
mock.Mock.Test(t)
|
||||
|
||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||
|
||||
return mock
|
||||
}
|
|
@ -216,7 +216,7 @@ func (s *service) getObjectRestrictions(rh RestrictionHolder) (r ObjectRestricti
|
|||
}
|
||||
|
||||
if !errors.Is(r.Check(model.Restrictions_Template), ErrRestricted) {
|
||||
if _, err := s.store.GetObjectType(rh.ObjectType()); err != nil {
|
||||
if _, err := s.objectStore.GetObjectType(rh.ObjectType()); err != nil {
|
||||
r = append(r, model.Restrictions_Template)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,20 +3,44 @@ package restriction
|
|||
import (
|
||||
"testing"
|
||||
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/anyproto/any-sync/app"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/mock_objectstore"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
|
||||
"github.com/anyproto/anytype-heart/util/testMock"
|
||||
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type fixture struct {
|
||||
Service
|
||||
objectStoreMock *mock_objectstore.MockObjectStore
|
||||
}
|
||||
|
||||
func newFixture(t *testing.T) *fixture {
|
||||
objectStore := mock_objectstore.NewMockObjectStore(t)
|
||||
objectStore.EXPECT().Name().Return("objectstore")
|
||||
|
||||
sbtProvider := mock_typeprovider.NewMockSmartBlockTypeProvider(t)
|
||||
sbtProvider.EXPECT().Name().Return("sbtProvider")
|
||||
|
||||
a := &app.App{}
|
||||
a.Register(objectStore)
|
||||
a.Register(sbtProvider)
|
||||
s := New()
|
||||
err := s.Init(a)
|
||||
require.NoError(t, err)
|
||||
return &fixture{
|
||||
Service: s,
|
||||
objectStoreMock: objectStore,
|
||||
}
|
||||
}
|
||||
|
||||
func TestService_ObjectRestrictionsById(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
store := testMock.NewMockObjectStore(ctrl)
|
||||
store.EXPECT().GetObjectType(gomock.Any()).AnyTimes()
|
||||
rest := New(nil, store)
|
||||
rest := newFixture(t)
|
||||
rest.objectStoreMock.EXPECT().GetObjectType(mock.Anything).Return(nil, nil)
|
||||
|
||||
assert.ErrorIs(t, rest.GetRestrictions(&restrictionHolder{
|
||||
id: "",
|
||||
|
@ -110,11 +134,9 @@ func TestService_ObjectRestrictionsById(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestTemplateRestriction(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
store := testMock.NewMockObjectStore(ctrl)
|
||||
store.EXPECT().GetObjectType(bundle.TypeKeyPage.URL()).Return(nil, objectstore.ErrObjectNotFound)
|
||||
store.EXPECT().GetObjectType(bundle.TypeKeyContact.URL()).Return(&model.ObjectType{}, nil)
|
||||
rs := New(nil, store)
|
||||
rs := newFixture(t)
|
||||
rs.objectStoreMock.EXPECT().GetObjectType(bundle.TypeKeyPage.URL()).Return(nil, objectstore.ErrObjectNotFound)
|
||||
rs.objectStoreMock.EXPECT().GetObjectType(bundle.TypeKeyContact.URL()).Return(&model.ObjectType{}, nil)
|
||||
|
||||
assert.ErrorIs(t, rs.GetRestrictions(&restrictionHolder{
|
||||
id: "cannot make template from Template smartblock type",
|
||||
|
|
|
@ -33,17 +33,16 @@ type Service interface {
|
|||
|
||||
type service struct {
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider
|
||||
store objectstore.ObjectStore
|
||||
objectStore objectstore.ObjectStore
|
||||
}
|
||||
|
||||
func New(sbtProvider typeprovider.SmartBlockTypeProvider, objectStore objectstore.ObjectStore) Service {
|
||||
return &service{
|
||||
sbtProvider: sbtProvider,
|
||||
store: objectStore,
|
||||
}
|
||||
func New() Service {
|
||||
return &service{}
|
||||
}
|
||||
|
||||
func (s *service) Init(*app.App) (err error) {
|
||||
func (s *service) Init(a *app.App) (err error) {
|
||||
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -75,7 +74,7 @@ func (s *service) getRestrictionsById(spaceID string, id string) (r Restrictions
|
|||
return Restrictions{}, fmt.Errorf("get smartblock type: %w", err)
|
||||
}
|
||||
layout := model.ObjectTypeLayout(noLayout)
|
||||
d, err := s.store.GetDetails(id)
|
||||
d, err := s.objectStore.GetDetails(id)
|
||||
var ot string
|
||||
if err == nil {
|
||||
if pbtypes.HasField(d.GetDetails(), bundle.RelationKeyLayout.String()) {
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
)
|
||||
|
||||
func TestService_GetRestrictions(t *testing.T) {
|
||||
s := New(nil, nil)
|
||||
s := New()
|
||||
res := s.GetRestrictions(&restrictionHolder{tp: model.SmartBlockType_BundledObjectType})
|
||||
assert.NotEmpty(t, res.Object)
|
||||
}
|
||||
|
|
|
@ -90,16 +90,9 @@ type SmartblockOpener interface {
|
|||
Open(id string) (sb smartblock.SmartBlock, err error)
|
||||
}
|
||||
|
||||
func New(
|
||||
tempDirProvider *core.TempDirService,
|
||||
sbtProvider typeprovider.SmartBlockTypeProvider,
|
||||
layoutConverter converter.LayoutConverter,
|
||||
) *Service {
|
||||
func New() *Service {
|
||||
return &Service{
|
||||
tempDirProvider: tempDirProvider,
|
||||
sbtProvider: sbtProvider,
|
||||
layoutConverter: layoutConverter,
|
||||
closing: make(chan struct{}),
|
||||
closing: make(chan struct{}),
|
||||
syncer: map[string]*treeSyncer{},
|
||||
openedObjs: &openedObjects{
|
||||
objects: make(map[string]bool),
|
||||
|
@ -198,6 +191,11 @@ func (s *Service) Init(a *app.App) (err error) {
|
|||
s.fileStore = app.MustComponent[filestore.FileStore](a)
|
||||
s.fileSync = app.MustComponent[filesync.FileSync](a)
|
||||
s.fileService = app.MustComponent[files.Service](a)
|
||||
|
||||
s.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
|
||||
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
s.layoutConverter = app.MustComponent[converter.LayoutConverter](a)
|
||||
|
||||
s.indexer = app.MustComponent[indexer](a)
|
||||
s.builtinObjectService = app.MustComponent[builtinObjects](a)
|
||||
s.cache = s.createCache()
|
||||
|
|
|
@ -12,15 +12,15 @@ const (
|
|||
<meta name="CocoaVersion" content="1894.1">
|
||||
<style type="text/css">
|
||||
.row > * { display: flex; }
|
||||
.header1 { padding: 23px 0px 1px 0px; font-size: 28px; line-height: 32px; letter-spacing: -0.36px; font-weight: 600; }
|
||||
.header2 { padding: 15px 0px 1px 0px; font-size: 22px; line-height: 28px; letter-spacing: -0.16px; font-weight: 600; }
|
||||
.header3 { padding: 15px 0px 1px 0px; font-size: 17px; line-height: 24px; font-weight: 600; }
|
||||
.quote { padding: 7px 0px 7px 0px; font-size: 18px; line-height: 26px; font-style: italic; }
|
||||
.paragraph { font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word; }
|
||||
.header1 {` + styleHeader1 + `}
|
||||
.header2 {` + styleHeader2 + `}
|
||||
.header3 {` + styleHeader3 + `}
|
||||
.quote {` + styleQuote + `}
|
||||
.paragraph {` + styleParagraph + `}
|
||||
.callout-image { width: 20px; height: 20px; font-size: 16px; line-height: 20px; margin-right: 6px; display: inline-block; }
|
||||
.callout-image img { width: 100%; object-fit: cover; }
|
||||
a { cursor: pointer; }
|
||||
kbd { display: inline; font-family: 'Mono'; line-height: 1.71; background: rgba(247,245,240,0.5); padding: 0px 4px; border-radius: 2px; }
|
||||
kbd {` + styleKbd + `}
|
||||
ul { margin: 0px; }
|
||||
</style>
|
||||
</head>
|
||||
|
@ -74,7 +74,7 @@ var styleTags = map[model.BlockContentTextStyle]styleTag{
|
|||
model.BlockContentText_Title: {OpenTag: `<h1 style="` + styleTitle + `">`, CloseTag: `</h1>`},
|
||||
model.BlockContentText_Checkbox: {OpenTag: `<div style="` + styleCheckbox + `" class="check"><input type="checkbox"/>`, CloseTag: `</div>`},
|
||||
model.BlockContentText_Toggle: {OpenTag: `<div style="` + styleToggle + `" class="toggle">`, CloseTag: `</div>`},
|
||||
defaultStyle: {OpenTag: `<div style="` + styleParagraph + `" class="paragraph" style="` + styleParagraph + `">`, CloseTag: `</div>`},
|
||||
defaultStyle: {OpenTag: `<div style="` + styleParagraph + `" class="paragraph">`, CloseTag: `</div>`},
|
||||
}
|
||||
|
||||
func textColor(color string) string {
|
||||
|
|
|
@ -139,6 +139,9 @@ func (h *HTML) renderText(rs *renderState, b *model.Block) {
|
|||
tags, ok := styleTags[text.Style]
|
||||
if !ok {
|
||||
tags = styleTags[defaultStyle]
|
||||
if text.Text == "" {
|
||||
tags = styleTag{OpenTag: "<p>", CloseTag: "</p>"}
|
||||
}
|
||||
}
|
||||
rs.Close()
|
||||
h.buf.WriteString(tags.OpenTag)
|
||||
|
|
|
@ -365,7 +365,7 @@ func givenTrimmedString(s string) string {
|
|||
}
|
||||
|
||||
const markupExpectation = `
|
||||
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">
|
||||
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">
|
||||
<b>0
|
||||
<i>1</i>
|
||||
</b>
|
||||
|
@ -434,7 +434,7 @@ const intersectMarksExpectation = `
|
|||
const columnsExpectation = `
|
||||
<div class="row" style="display: flex">
|
||||
<div class="column" >
|
||||
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">1</div></div><div class="column" ><div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">
|
||||
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">1</div></div><div class="column" ><div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">
|
||||
2
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -23,73 +23,6 @@ func (_m *MockSender) EXPECT() *MockSender_Expecter {
|
|||
return &MockSender_Expecter{mock: &_m.Mock}
|
||||
}
|
||||
|
||||
// Broadcast provides a mock function with given fields: _a0
|
||||
func (_m *MockSender) Broadcast(_a0 *pb.Event) {
|
||||
_m.Called(_a0)
|
||||
}
|
||||
|
||||
// MockSender_Broadcast_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Broadcast'
|
||||
type MockSender_Broadcast_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// Broadcast is a helper method to define mock.On call
|
||||
// - _a0 *pb.Event
|
||||
func (_e *MockSender_Expecter) Broadcast(_a0 interface{}) *MockSender_Broadcast_Call {
|
||||
return &MockSender_Broadcast_Call{Call: _e.mock.On("Broadcast", _a0)}
|
||||
}
|
||||
|
||||
func (_c *MockSender_Broadcast_Call) Run(run func(_a0 *pb.Event)) *MockSender_Broadcast_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(*pb.Event))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_Broadcast_Call) Return() *MockSender_Broadcast_Call {
|
||||
_c.Call.Return()
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_Broadcast_Call) RunAndReturn(run func(*pb.Event)) *MockSender_Broadcast_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// BroadcastToOtherSessions provides a mock function with given fields: token, e
|
||||
func (_m *MockSender) BroadcastToOtherSessions(token string, e *pb.Event) {
|
||||
_m.Called(token, e)
|
||||
}
|
||||
|
||||
// MockSender_BroadcastToOtherSessions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastToOtherSessions'
|
||||
type MockSender_BroadcastToOtherSessions_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// BroadcastToOtherSessions is a helper method to define mock.On call
|
||||
// - token string
|
||||
// - e *pb.Event
|
||||
func (_e *MockSender_Expecter) BroadcastToOtherSessions(token interface{}, e interface{}) *MockSender_BroadcastToOtherSessions_Call {
|
||||
return &MockSender_BroadcastToOtherSessions_Call{Call: _e.mock.On("BroadcastToOtherSessions", token, e)}
|
||||
}
|
||||
|
||||
func (_c *MockSender_BroadcastToOtherSessions_Call) Run(run func(token string, e *pb.Event)) *MockSender_BroadcastToOtherSessions_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(string), args[1].(*pb.Event))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_BroadcastToOtherSessions_Call) Return() *MockSender_BroadcastToOtherSessions_Call {
|
||||
_c.Call.Return()
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_BroadcastToOtherSessions_Call) RunAndReturn(run func(string, *pb.Event)) *MockSender_BroadcastToOtherSessions_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// Init provides a mock function with given fields: a
|
||||
func (_m *MockSender) Init(a *app.App) error {
|
||||
ret := _m.Called(a)
|
||||
|
@ -132,48 +65,6 @@ func (_c *MockSender_Init_Call) RunAndReturn(run func(*app.App) error) *MockSend
|
|||
return _c
|
||||
}
|
||||
|
||||
// IsActive provides a mock function with given fields: token
|
||||
func (_m *MockSender) IsActive(token string) bool {
|
||||
ret := _m.Called(token)
|
||||
|
||||
var r0 bool
|
||||
if rf, ok := ret.Get(0).(func(string) bool); ok {
|
||||
r0 = rf(token)
|
||||
} else {
|
||||
r0 = ret.Get(0).(bool)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// MockSender_IsActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsActive'
|
||||
type MockSender_IsActive_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// IsActive is a helper method to define mock.On call
|
||||
// - token string
|
||||
func (_e *MockSender_Expecter) IsActive(token interface{}) *MockSender_IsActive_Call {
|
||||
return &MockSender_IsActive_Call{Call: _e.mock.On("IsActive", token)}
|
||||
}
|
||||
|
||||
func (_c *MockSender_IsActive_Call) Run(run func(token string)) *MockSender_IsActive_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(string))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_IsActive_Call) Return(_a0 bool) *MockSender_IsActive_Call {
|
||||
_c.Call.Return(_a0)
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_IsActive_Call) RunAndReturn(run func(string) bool) *MockSender_IsActive_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
||||
// Name provides a mock function with given fields:
|
||||
func (_m *MockSender) Name() string {
|
||||
ret := _m.Called()
|
||||
|
@ -215,36 +106,35 @@ func (_c *MockSender_Name_Call) RunAndReturn(run func() string) *MockSender_Name
|
|||
return _c
|
||||
}
|
||||
|
||||
// SendToSession provides a mock function with given fields: token, _a1
|
||||
func (_m *MockSender) SendToSession(token string, _a1 *pb.Event) {
|
||||
_m.Called(token, _a1)
|
||||
// Send provides a mock function with given fields: _a0
|
||||
func (_m *MockSender) Send(_a0 *pb.Event) {
|
||||
_m.Called(_a0)
|
||||
}
|
||||
|
||||
// MockSender_SendToSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendToSession'
|
||||
type MockSender_SendToSession_Call struct {
|
||||
// MockSender_Send_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Send'
|
||||
type MockSender_Send_Call struct {
|
||||
*mock.Call
|
||||
}
|
||||
|
||||
// SendToSession is a helper method to define mock.On call
|
||||
// - token string
|
||||
// - _a1 *pb.Event
|
||||
func (_e *MockSender_Expecter) SendToSession(token interface{}, _a1 interface{}) *MockSender_SendToSession_Call {
|
||||
return &MockSender_SendToSession_Call{Call: _e.mock.On("SendToSession", token, _a1)}
|
||||
// Send is a helper method to define mock.On call
|
||||
// - _a0 *pb.Event
|
||||
func (_e *MockSender_Expecter) Send(_a0 interface{}) *MockSender_Send_Call {
|
||||
return &MockSender_Send_Call{Call: _e.mock.On("Send", _a0)}
|
||||
}
|
||||
|
||||
func (_c *MockSender_SendToSession_Call) Run(run func(token string, _a1 *pb.Event)) *MockSender_SendToSession_Call {
|
||||
func (_c *MockSender_Send_Call) Run(run func(_a0 *pb.Event)) *MockSender_Send_Call {
|
||||
_c.Call.Run(func(args mock.Arguments) {
|
||||
run(args[0].(string), args[1].(*pb.Event))
|
||||
run(args[0].(*pb.Event))
|
||||
})
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_SendToSession_Call) Return() *MockSender_SendToSession_Call {
|
||||
func (_c *MockSender_Send_Call) Return() *MockSender_Send_Call {
|
||||
_c.Call.Return()
|
||||
return _c
|
||||
}
|
||||
|
||||
func (_c *MockSender_SendToSession_Call) RunAndReturn(run func(string, *pb.Event)) *MockSender_SendToSession_Call {
|
||||
func (_c *MockSender_Send_Call) RunAndReturn(run func(*pb.Event)) *MockSender_Send_Call {
|
||||
_c.Call.Return(run)
|
||||
return _c
|
||||
}
|
||||
|
|
|
@ -81,11 +81,8 @@ type service struct {
|
|||
objectStore objectstore.ObjectStore
|
||||
}
|
||||
|
||||
func New(statusWatcher SyncStatusWatcher, objectStore objectstore.ObjectStore) Service {
|
||||
return &service{
|
||||
syncStatusWatcher: statusWatcher,
|
||||
objectStore: objectStore,
|
||||
}
|
||||
func New() Service {
|
||||
return &service{}
|
||||
}
|
||||
|
||||
func (s *service) Init(a *app.App) (err error) {
|
||||
|
@ -95,6 +92,8 @@ func (s *service) Init(a *app.App) (err error) {
|
|||
s.spaceService = a.MustComponent(space.CName).(space.Service)
|
||||
s.dagService = s.commonFile.DAGService()
|
||||
s.fileStorage = app.MustComponent[filestorage.FileStorage](a)
|
||||
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
|
||||
s.syncStatusWatcher = app.MustComponent[SyncStatusWatcher](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -31,10 +31,8 @@ const FlatfsDirName = "flatfs"
|
|||
|
||||
var log = logger.NewNamed(CName)
|
||||
|
||||
func New(eventSender event.Sender) FileStorage {
|
||||
return &fileStorage{
|
||||
eventSender: eventSender,
|
||||
}
|
||||
func New() FileStorage {
|
||||
return &fileStorage{}
|
||||
}
|
||||
|
||||
type FileStorage interface {
|
||||
|
@ -70,6 +68,7 @@ func (f *fileStorage) Init(a *app.App) (err error) {
|
|||
f.rpcStore = a.MustComponent(rpcstore.CName).(rpcstore.Service)
|
||||
f.spaceStorage = a.MustComponent(spacestorage.CName).(storage.ClientStorage)
|
||||
f.handler = &rpcHandler{spaceStorage: f.spaceStorage}
|
||||
f.sendEvent = app.MustComponent[event.Sender](a).Send
|
||||
if fileCfg.IPFSStorageAddr == "" {
|
||||
f.flatfsPath = filepath.Join(app.MustComponent[wallet.Wallet](a).RepoPath(), FlatfsDirName)
|
||||
} else {
|
||||
|
|
|
@ -73,10 +73,9 @@ type fileSync struct {
|
|||
spaceStats map[string]SpaceStat
|
||||
}
|
||||
|
||||
func New(eventSender event.Sender) FileSync {
|
||||
func New() FileSync {
|
||||
return &fileSync{
|
||||
eventSender: eventSender,
|
||||
spaceStats: map[string]SpaceStat{},
|
||||
spaceStats: map[string]SpaceStat{},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,6 +85,7 @@ func (f *fileSync) Init(a *app.App) (err error) {
|
|||
f.dagService = a.MustComponent(fileservice.CName).(fileservice.FileService).DAGService()
|
||||
f.fileStore = app.MustComponent[filestore.FileStore](a)
|
||||
f.spaceService = app.MustComponent[space.Service](a)
|
||||
f.eventSender = app.MustComponent[event.Sender](a)
|
||||
f.removePingCh = make(chan struct{})
|
||||
f.uploadPingCh = make(chan struct{})
|
||||
return
|
||||
|
|
|
@ -32,6 +32,7 @@ import (
|
|||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/filestore"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/pb/storage"
|
||||
"github.com/anyproto/anytype-heart/space/mock_space"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
|
@ -84,7 +85,7 @@ func TestFileSync_RemoveFile(t *testing.T) {
|
|||
func newFixture(t *testing.T) *fixture {
|
||||
sender := mock_event.NewMockSender(t)
|
||||
fx := &fixture{
|
||||
FileSync: New(sender),
|
||||
FileSync: New(),
|
||||
fileService: fileservice.New(),
|
||||
ctrl: gomock.NewController(t),
|
||||
a: new(app.App),
|
||||
|
@ -118,13 +119,19 @@ func newFixture(t *testing.T) *fixture {
|
|||
spaceService.EXPECT().AccountId().Return("space1").AnyTimes()
|
||||
spaceService.EXPECT().Close(gomock.Any()).AnyTimes()
|
||||
|
||||
sender := mock_event.NewMockSender(t)
|
||||
sender.EXPECT().Name().Return("event")
|
||||
sender.EXPECT().Init(mock.Anything).Return(nil)
|
||||
sender.EXPECT().Send(mock.Anything).Return().Maybe()
|
||||
|
||||
fx.a.Register(fx.fileService).
|
||||
Register(&inMemBlockStore{data: map[string]blocks.Block{}}).
|
||||
Register(bp).
|
||||
Register(mockRpcStoreService).
|
||||
Register(fx.FileSync).
|
||||
Register(fileStoreMock).
|
||||
Register(spaceService)
|
||||
Register(spaceService).
|
||||
Register(sender)
|
||||
require.NoError(t, fx.a.Start(ctx))
|
||||
return fx
|
||||
}
|
||||
|
|
|
@ -66,15 +66,8 @@ var (
|
|||
ftIndexForceMinInterval = time.Second * 10
|
||||
)
|
||||
|
||||
func New(
|
||||
picker block.Picker,
|
||||
spaceService space.Service,
|
||||
fileService files.Service,
|
||||
) Indexer {
|
||||
func New() Indexer {
|
||||
return &indexer{
|
||||
picker: picker,
|
||||
spaceService: spaceService,
|
||||
fileService: fileService,
|
||||
indexedFiles: &sync.Map{},
|
||||
}
|
||||
}
|
||||
|
@ -133,6 +126,9 @@ func (i *indexer) Init(a *app.App) (err error) {
|
|||
i.ftsearch = app.MustComponent[ftsearch.FTSearch](a)
|
||||
i.subObjectCreator = app.MustComponent[subObjectCreator](a)
|
||||
i.syncStarter = app.MustComponent[syncStarter](a)
|
||||
i.picker = app.MustComponent[block.Picker](a)
|
||||
i.spaceService = app.MustComponent[space.Service](a)
|
||||
i.fileService = app.MustComponent[files.Service](a)
|
||||
i.quit = make(chan struct{})
|
||||
i.forceFt = make(chan struct{})
|
||||
return
|
||||
|
|
|
@ -23,6 +23,7 @@ import (
|
|||
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
|
||||
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
|
||||
"github.com/anyproto/anytype-heart/util/pbtypes"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
func Test_GrouperTags(t *testing.T) {
|
||||
|
|
|
@ -36,11 +36,8 @@ var log = logging.Logger("anytype-mw-subscription")
|
|||
|
||||
var batchTime = 50 * time.Millisecond
|
||||
|
||||
func New(collectionService CollectionService, sbtProvider typeprovider.SmartBlockTypeProvider) Service {
|
||||
return &service{
|
||||
collectionService: collectionService,
|
||||
sbtProvider: sbtProvider,
|
||||
}
|
||||
func New() Service {
|
||||
return &service{}
|
||||
}
|
||||
|
||||
type Service interface {
|
||||
|
@ -92,6 +89,8 @@ func (s *service) Init(a *app.App) (err error) {
|
|||
s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
|
||||
s.kanban = a.MustComponent(kanban.CName).(kanban.Service)
|
||||
s.recBatch = mb.New(0)
|
||||
s.collectionService = app.MustComponent[CollectionService](a)
|
||||
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
s.eventSender = a.MustComponent(event.CName).(event.Sender)
|
||||
s.ctxBuf = &opCtx{c: s.cache}
|
||||
return
|
||||
|
|
|
@ -6,11 +6,9 @@ import (
|
|||
|
||||
"github.com/anyproto/any-sync/app"
|
||||
"github.com/gogo/protobuf/types"
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/anyproto/anytype-heart/core/event"
|
||||
"github.com/anyproto/anytype-heart/core/event/mock_event"
|
||||
"github.com/anyproto/anytype-heart/core/session"
|
||||
|
@ -19,8 +17,10 @@ import (
|
|||
"github.com/anyproto/anytype-heart/pkg/lib/database"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
|
||||
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
|
||||
"github.com/anyproto/anytype-heart/util/pbtypes"
|
||||
"github.com/anyproto/anytype-heart/util/testMock"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
func TestService_Search(t *testing.T) {
|
||||
|
@ -317,13 +317,19 @@ func (c *collectionServiceMock) SubscribeForCollection(ctx session.Context, coll
|
|||
func (c *collectionServiceMock) UnsubscribeFromCollection(collectionID string, subscriptionID string) {
|
||||
}
|
||||
|
||||
func (c *collectionServiceMock) Name() string {
|
||||
return "collectionService"
|
||||
}
|
||||
|
||||
func (c *collectionServiceMock) Init(a *app.App) error { return nil }
|
||||
|
||||
func newFixture(t *testing.T) *fixture {
|
||||
ctrl := gomock.NewController(t)
|
||||
a := new(app.App)
|
||||
testMock.RegisterMockObjectStore(ctrl, a)
|
||||
testMock.RegisterMockKanban(ctrl, a)
|
||||
fx := &fixture{
|
||||
Service: New(&collectionServiceMock{}, nil),
|
||||
Service: New(),
|
||||
a: a,
|
||||
ctrl: ctrl,
|
||||
store: a.MustComponent(objectstore.CName).(*testMock.MockObjectStore),
|
||||
|
@ -337,6 +343,13 @@ func newFixture(t *testing.T) *fixture {
|
|||
fx.sender = sender
|
||||
a.Register(fx.Service)
|
||||
a.Register(fx.sender)
|
||||
a.Register(&collectionServiceMock{updateCh: make(chan []string, 1)})
|
||||
|
||||
sbtProvider := mock_typeprovider.NewMockSmartBlockTypeProvider(t)
|
||||
sbtProvider.EXPECT().Name().Return("sbtProvider")
|
||||
sbtProvider.EXPECT().Init(mock.Anything).Return(nil)
|
||||
|
||||
a.Register(sbtProvider)
|
||||
|
||||
fx.store.EXPECT().SubscribeForAll(gomock.Any())
|
||||
require.NoError(t, a.Start(context.Background()))
|
||||
|
|
|
@ -36,8 +36,10 @@ type Service interface {
|
|||
var _ Service = (*service)(nil)
|
||||
|
||||
type service struct {
|
||||
typeProvider typeprovider.SmartBlockTypeProvider
|
||||
spaceService space.Service
|
||||
typeProvider typeprovider.SmartBlockTypeProvider
|
||||
spaceService space.Service
|
||||
fileSyncService filesync.FileSync
|
||||
fileWatcherUpdateInterval time.Duration
|
||||
|
||||
coreService core.Service
|
||||
|
||||
|
@ -48,38 +50,35 @@ type service struct {
|
|||
updateReceiver *updateReceiver
|
||||
}
|
||||
|
||||
func New(
|
||||
typeProvider typeprovider.SmartBlockTypeProvider,
|
||||
dbProvider datastore.Datastore,
|
||||
spaceService space.Service,
|
||||
coreService core.Service,
|
||||
fileSyncService filesync.FileSync,
|
||||
nodeConfService nodeconf.Service,
|
||||
fileStore filestore.FileStore,
|
||||
picker getblock.Picker,
|
||||
cfg *config.Config,
|
||||
eventSender event.Sender,
|
||||
fileWatcherUpdateInterval time.Duration,
|
||||
) Service {
|
||||
fileStatusRegistry := newFileStatusRegistry(fileSyncService, fileStore, picker, fileWatcherUpdateInterval)
|
||||
linkedFilesWatcher := newLinkedFilesWatcher(spaceService, fileStatusRegistry)
|
||||
subObjectsWatcher := newSubObjectsWatcher()
|
||||
updateReceiver := newUpdateReceiver(coreService, linkedFilesWatcher, subObjectsWatcher, nodeConfService, cfg, eventSender)
|
||||
fileWatcher := newFileWatcher(spaceService, dbProvider, fileStatusRegistry, updateReceiver, fileWatcherUpdateInterval)
|
||||
objectWatcher := newObjectWatcher(spaceService, updateReceiver)
|
||||
func New(fileWatcherUpdateInterval time.Duration) Service {
|
||||
return &service{
|
||||
spaceService: spaceService,
|
||||
typeProvider: typeProvider,
|
||||
coreService: coreService,
|
||||
fileWatcher: fileWatcher,
|
||||
objectWatcher: objectWatcher,
|
||||
subObjectsWatcher: subObjectsWatcher,
|
||||
linkedFilesWatcher: linkedFilesWatcher,
|
||||
updateReceiver: updateReceiver,
|
||||
fileWatcherUpdateInterval: fileWatcherUpdateInterval,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *service) Init(a *app.App) (err error) {
|
||||
s.spaceService = app.MustComponent[space.Service](a)
|
||||
s.typeProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
s.coreService = app.MustComponent[core.Service](a)
|
||||
s.fileSyncService = app.MustComponent[filesync.FileSync](a)
|
||||
|
||||
dbProvider := app.MustComponent[datastore.Datastore](a)
|
||||
spaceService := app.MustComponent[space.Service](a)
|
||||
coreService := app.MustComponent[core.Service](a)
|
||||
nodeConfService := app.MustComponent[nodeconf.Service](a)
|
||||
fileStore := app.MustComponent[filestore.FileStore](a)
|
||||
picker := app.MustComponent[getblock.Picker](a)
|
||||
cfg := app.MustComponent[*config.Config](a)
|
||||
sendEvent := app.MustComponent[event.Sender](a).Send
|
||||
|
||||
fileStatusRegistry := newFileStatusRegistry(s.fileSyncService, fileStore, picker, s.fileWatcherUpdateInterval)
|
||||
s.linkedFilesWatcher = newLinkedFilesWatcher(spaceService, fileStatusRegistry)
|
||||
s.subObjectsWatcher = newSubObjectsWatcher()
|
||||
s.updateReceiver = newUpdateReceiver(coreService, s.linkedFilesWatcher, s.subObjectsWatcher, nodeConfService, cfg, sendEvent)
|
||||
s.fileWatcher = newFileWatcher(spaceService, dbProvider, fileStatusRegistry, s.updateReceiver, s.fileWatcherUpdateInterval)
|
||||
s.objectWatcher = newObjectWatcher(spaceService, s.updateReceiver)
|
||||
|
||||
s.fileSyncService.OnUpload(s.OnFileUpload)
|
||||
return s.fileWatcher.init()
|
||||
}
|
||||
|
||||
|
|
9
docs/Architecture.md
Normal file
9
docs/Architecture.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Architecture
|
||||
|
||||
## Services/components
|
||||
### Bootstrapping
|
||||
If you need your component to be visible to other components, you need to register it in Service Locator's registry.
|
||||
To do it go to `Bootstrap` function in `core/anytype/bootstrap.go` and `Register` it
|
||||
|
||||
### Dependency injection
|
||||
We use our own implementation of Service Locator pattern: `github.com/anyproto/any-sync/app`.
|
45
docs/Build.md
Normal file
45
docs/Build.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
# Build instructions
|
||||
## Build from Source
|
||||
1. Install Golang 1.21.x [from here](http://golang.org/dl/) or using preferred package manager
|
||||
2. Follow instructions below for the target systems
|
||||
|
||||
### Install local deps
|
||||
|
||||
#### Mac
|
||||
As of 16.01.23 last protobuf version (21.12) broke the JS plugin support, so you can use the v3 branch:
|
||||
```
|
||||
brew install protobuf@3
|
||||
```
|
||||
|
||||
To generate Swift protobuf:
|
||||
```
|
||||
brew install swift-protobuf
|
||||
```
|
||||
|
||||
#### Debian/Ubuntu
|
||||
We need to have protoc binary (3.x version) and libprotoc headers in orderto build the grpc-web plugin
|
||||
```
|
||||
apt install protobuf-compiler libprotoc-dev
|
||||
```
|
||||
|
||||
### Build and install for the [desktop client](https://github.com/anyproto/anytype-ts)
|
||||
`make install-dev-js` — build the local server and copy it and protobuf binding into `../anytype-ts`
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
|
||||
### Build for iOS
|
||||
Instructions to set up environment for iOS: [here](https://github.com/anyproto/anytype-swift/blob/main/docs/Setup_For_Middleware.md)
|
||||
1. `make build-ios` to build the framework into `dist/ios` folder
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
2. `make protos-swift` to generate swift protobuf bindings into `dist/ios/pb`
|
||||
|
||||
### Build for Android
|
||||
Instructions to setup environment for Android: [here](https://github.com/anyproto/anytype-kotlin/blob/main/docs/Setup_For_Middleware.md)
|
||||
1. `make build-android` to build the library into `dist/android` folder
|
||||
|
||||
Parameters:
|
||||
- `ANY_SYNC_NETWORK=/path/to/network.yml` — build using self-hosted [network configuration](https://tech.anytype.io/anytype-heart/configuration)
|
||||
2. `make protos-java` to generate java protobuf bindings into `dist/android/pb`
|
89
docs/Debug.md
Normal file
89
docs/Debug.md
Normal file
|
@ -0,0 +1,89 @@
|
|||
# Debug
|
||||
## Run local gRPC server to debug
|
||||
⚠️ Make sure to update/install protobuf compiler from [this repo](https://github.com/anyproto/protobuf) using `make setup-protoc`
|
||||
|
||||
Commands:
|
||||
- `make run-server` - builds proto files for grpc server, builds the binary and runs it
|
||||
- `make build-server` - builds proto files for grpc server and builds the binary into `dist/server`
|
||||
|
||||
If you want to change the default port(9999):
|
||||
|
||||
`ANYTYPE_GRPC_ADDR=127.0.0.1:8888 make run-debug`
|
||||
|
||||
----
|
||||
## Useful tools for debug
|
||||
|
||||
### Debug server
|
||||
Use env var ANYDEBUG=address to enable debugging HTTP server. For example: `ANYDEBUG=:6061` will start debug server on port 6061
|
||||
|
||||
You can find all endpoints in `/debug` page. For example: http://localhost:6061/debug
|
||||
|
||||
### gRPC logging
|
||||
In order to log mw gRPC requests/responses use `ANYTYPE_GRPC_LOG` env var:
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=1` - log only method names
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=2` - log method names + payloads for commands
|
||||
- `ANYTYPE_LOG_LEVEL="grpc=DEBUG" ANYTYPE_GRPC_LOG=2` - log method names + payloads for commands&events
|
||||
|
||||
### gRPC tracing
|
||||
1. Run jaeger UI on the local machine:
|
||||
```docker run --rm -d -p6832:6832/udp -p6831:6831/udp -p16686:16686 -p5778:5778 -p5775:5775/udp jaegertracing/all-in-one:latest```
|
||||
2. Run mw with `ANYTYPE_GRPC_TRACE` env var:
|
||||
- `ANYTYPE_GRPC_TRACE=1` - log only method names/times
|
||||
- `ANYTYPE_GRPC_TRACE=2` - log method names + payloads for commands
|
||||
- `ANYTYPE_GRPC_TRACE=2` - log method names + payloads for commands&events
|
||||
3. Open Jaeger UI at http://localhost:16686
|
||||
|
||||
### Debug tree
|
||||
1. You can use `cmd/debugtree.go` to perform different operations with tree exported in zip archive (`rpc DebugTree`)
|
||||
2. The usage looks like this `go run debugtree.go -j -t -f [path to zip archive]` where `-t` tells the cmd to generate tree graph view and `-j` - to generate json representation of the tree (i.e. data in each individual block)
|
||||
3. You can use flag `-r` to build the tree from its root, that way you will see all the changes in the tree, and not only those from the common snapshot
|
||||
3. For more info please check the command usage in `debugtree.go`
|
||||
|
||||
### gRPC clients
|
||||
|
||||
#### GUI
|
||||
|
||||
https://github.com/uw-labs/bloomrpc
|
||||
|
||||
HowTo: Set the import path to the middleware root, then select commands.proto file
|
||||
|
||||
#### CLI
|
||||
|
||||
https://github.com/fullstorydev/grpcurl
|
||||
|
||||
You should specify import-path to the root of anytype-heart repository and gRPC port of running application
|
||||
|
||||
Command examples:
|
||||
|
||||
- List available methods
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe
|
||||
```
|
||||
|
||||
- Describe method signature
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
- Describe structure of specified protobuf message
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto localhost:31007 describe .anytype.Rpc.Object.Create.Request
|
||||
```
|
||||
|
||||
- Call method with specified plain-text payload
|
||||
```
|
||||
grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto -plaintext -d '{"details": {"name": "hello there", "type": "ot-page"}}' localhost:31007 anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
- Call method using unix pipe
|
||||
```
|
||||
echo '{"details": {"name": "hello there", "type": "ot-page"}}' | grpcurl -import-path ../anytype-heart/ -proto pb/protos/service/service.proto -plaintext -d @ localhost:31007 anytype.ClientCommands.ObjectCreate
|
||||
```
|
||||
|
||||
## Running with prometheus and grafana
|
||||
- `cd metrics/docker` – cd into folder with docker-compose file
|
||||
- `docker-compose up` - run the prometheus/grafana
|
||||
- use `ANYTYPE_PROM=0.0.0.0:9094` when running middleware to enable metrics collection. Client commands metrics available only in gRPC mode
|
||||
- open http://127.0.0.1:3000 to view collected metrics in Grafana. You can find several dashboards there:
|
||||
- **MW** internal middleware metrics such as changes, added and created threads histograms
|
||||
- **MW commands server** metrics for clients commands. Works only in grpc-server mode
|
14
docs/Protogen.md
Normal file
14
docs/Protogen.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
## Rebuild protobuf generated files
|
||||
First, you need to install [protobuf](https://github.com/anyproto/anytype-heart#install-local-deps-mac) pkg using your preferred package manager.
|
||||
This repo uses custom protoc located at [anyproto/protobuf](https://github.com/anyproto/protobuf/tree/master/protoc-gen-gogo). It adds `gomobile` plugin and some env-controlled options to control the generated code style.
|
||||
This protobuf generator will replace your `protoc` binary, BTW it doesn't have any breaking changes for other protobuf and grpc code
|
||||
|
||||
You can override the binary with a simple command:
|
||||
```
|
||||
make setup-protoc
|
||||
```
|
||||
|
||||
Then you can easily regenerate proto files:
|
||||
```
|
||||
make protos
|
||||
```
|
46
docs/Testing.md
Normal file
46
docs/Testing.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Testing
|
||||
## Run tests
|
||||
Install dependencies for running tests and generate mocks:
|
||||
```
|
||||
make test-deps
|
||||
```
|
||||
|
||||
GO test:
|
||||
```
|
||||
make test
|
||||
```
|
||||
You'll need to install latest (at least clang 15)
|
||||
```
|
||||
brew install llvm
|
||||
echo 'export PATH="/<homebrew location>/llvm/bin:$PATH"' >> ~/.zshrc
|
||||
```
|
||||
|
||||
### Integration tests
|
||||
First you need to start a docker container via docker-compose:
|
||||
```
|
||||
export ANYTYPE_TEST_GRPC_PORT=31088
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
Then you can run the basic integration tests:
|
||||
```
|
||||
make test-integration
|
||||
```
|
||||
|
||||
## Writing tests
|
||||
|
||||
### Structure of tests
|
||||
Prefer structuring your tests in Act-Arrange-Assert style. Use comments for visual separation of those test parts, like:
|
||||
```go
|
||||
// Given
|
||||
...
|
||||
// When
|
||||
...
|
||||
// Then
|
||||
```
|
||||
|
||||
### Fixtures for services under test
|
||||
Define `fixture` structure to easily bootstrap service and its dependencies. You can find examples in our code.
|
||||
|
||||
### Mocking
|
||||
Prefer using Mockery for new mocks. It's configured in `.mockery.yaml`
|
|
@ -1,55 +0,0 @@
|
|||
### Store
|
||||
|
||||
Должна быть некоторая структура, которая будет хранить состояние приложения, а именно:
|
||||
|
||||
1. Какие документы/блоки с какими версиями сохранены.
|
||||
2. Какие экраны были открыты в последний раз, какие окна.
|
||||
3. Все настройки клиента, которые не сохраняются в IPFS, должны быть в этой структуре состояния.
|
||||
4. В каких поля ввода что содержится.
|
||||
|
||||
Когда Middleware штатно/аварийно завершает своё выполнение, при следующем запуске состояние должно восстанавливаться из этого файла.
|
||||
|
||||
Раз в несколько секунд middle записывает своё состояние в этот файл.
|
||||
|
||||
#### Наверное, плохая идея: store описан в .proto, клиент имеет к нему доступ
|
||||
|
||||
Плохая, потому что иначе на клиенте придется продублировать много функционала с middle, клиент должен быть абстрагирован от этой логики.
|
||||
|
||||
#### Получится-ли сходу реализовать соответствие files <--> documents/blocks
|
||||
|
||||
А что, если вот так:
|
||||
1. Есть центральная директория /Anytype, в которой лежат папки документов – на каждый документ по папке.
|
||||
2. В папке документа лежат файлы – по файлу на каждый блок. Если у документа есть внутренние документы, то там же, соответственно, лежат соответствующие им папки. Плюс лежит .json файл, который содержит структурную информацию документа. Тоже типа такой блок.
|
||||
3. В папке лежит .git папка, в которой содержится история версий.
|
||||
|
||||
Так вот, пишем watcher, который следит за изменениями как внутри файловой системы в директории /Anytype, так и за изменениями, сделанными в приложени Anytype, и автоматически коммитит изменения, меняет файлы.
|
||||
|
||||
То есть, например, скидываем картинки в папку /Anytype/kitties, и автоматом все юзеры, кто работает с этим документом, получают новые блоки с картинками.
|
||||
|
||||
Текстовые файлы, например, хранятся в виде markdown файлов.
|
||||
Информация о том, как отображать картинку, может хранится в meta-блоке изображения.
|
||||
|
||||
В идеале сделать так, чтобы информация по минимуму дублировалась. Однако мы не ограничены в использовании дополнительных файлов, которые будут хранить какие-то промежуточные представления, если они не будут содержать тяжелый контент.
|
||||
|
||||
#### Как это заимплементить, MVP
|
||||
Документ состоит только из текстовых блоков.
|
||||
Блоки и документ – каждый имеет свою историю версий.
|
||||
Есть чейн изменений блока, и есть его скомпилированный стейт. Скомпилированный стейт – .md файл. Чейн изменений – файлы в специальной директории.
|
||||
|
||||
Или так – блоки и документы хранятся на одном уровне иерархии, а в папке документа хранятся ссылки на эти блоки/файлы.
|
||||
|
||||
Есть директория /anytype.
|
||||
CLI-клиент, в котором есть команды:
|
||||
|
||||
```js
|
||||
block_create() -> docId
|
||||
block_set(id, 'text')
|
||||
block_remove(id)
|
||||
|
||||
doc_create() -> docId
|
||||
doc_addBlock(docId, id, prior)
|
||||
doc_setPrior(docId, id, prior)
|
||||
doc_removeBlock(docId, id)
|
||||
```
|
||||
|
||||
Есть watcher. Это JS-скрипт, который чекает изменения файлов в папке.
|
|
@ -1,125 +0,0 @@
|
|||
### User stories
|
||||
|
||||
#### 0. Как ответы задавать
|
||||
```js
|
||||
// 1. Избыточная информация, плюс Result получится слишком кастомным
|
||||
Package (id:'0x765', Reply {to:'0x123', error:Error{ type:WRONG_MNEMONIC, message:'Mnemonic is wrong' }, Result:{ type:FAILURE }})
|
||||
// 2. Сообщение тоже получается ибыточным. из Error.type мы можем его получать на клиенте, плюс локализация
|
||||
Package (id:'0x765', Status{ type:WRONG_MNEMONIC, message:'Mnemonic is wrong' })
|
||||
// 3.
|
||||
Package (id:'0x765', Error{ type:WRONG_MNEMONIC })
|
||||
Package (id:'0x765', Success{})
|
||||
// 4.
|
||||
Package (id:'0x765', Status{ type:WRONG_MNEMONIC })
|
||||
Package (id:'0x765', Status{ type:SUCCESS })
|
||||
```
|
||||
|
||||
Выбрали четвертый вариант
|
||||
|
||||
#### 1. Log in
|
||||
|
||||
```js
|
||||
// 1. Клиент передает мнемонику в middle, которую ввел пользователь
|
||||
Front: Package (id:'0x123', WalletLogin { mnemonic:'abc def ... xyz', pin:'12345'} )
|
||||
Middle: Package (id:'0x980', Status { replyTo:'0x123', type:SUCCESS })
|
||||
// 2. Middle начинает слать аккаунты
|
||||
Middle: Package (id:'0x789', AccountFound { Account {name:'Pablo', id:'0xabcabc', icon:'0x123123'}}})
|
||||
Middle: Package (id:'0x678', AccountFound{ Account {name:'Carlito', id:'0xabcabc', icon:'0x123123'}})
|
||||
// 2.B. Middle сообщает об ошибке
|
||||
Middle: Package (id:'0x765', Status { replyTo'0x123': type: WRONG_MNEMONIC })
|
||||
// 3. Клиент отправляет аккаунт, под которым хочет работать
|
||||
Front: Package (id:'0x789', AccountSelect {id:'0xabcabc'}})
|
||||
Middle: Package (id:'0x777', Status { replyTo'0x789': type: SUCCESS })
|
||||
```
|
||||
|
||||
#### 2. Sign up
|
||||
```js
|
||||
// 1. Просим создать аккаунт
|
||||
Front: Package (id:'0x123', WalletCreate {} )
|
||||
Middle: Package (id:'0x980', Status { replyTo'0x123': type: SUCCESS })
|
||||
|
||||
Front: Package (id:'0x345', AccountCreate { name:'Carlos', icon:'0x1231243257', pin:'1232724'} )
|
||||
Middle: Package (id:'0x456', Status { replyTo'0x345': type: SUCCESS })
|
||||
```
|
||||
|
||||
#### 3A. Получение списка документов (если store контролирует клиент)
|
||||
Нужно получить список id документов, их имена, аватарки, хеши последних актуальных версий
|
||||
Когда нужен этот сценарий? Когда юзер хочет запустить главный экран.
|
||||
|
||||
1. Юзер запустил приложение. Middle уже авторизован, пока ничего не отрисовано
|
||||
2. Фронт сообщает о том, какие у него документы есть
|
||||
|
||||
```js
|
||||
Front: Message StartUp (docs: [
|
||||
{root:0x345, last_ver:0x123},
|
||||
{root:0x456, last_ver:0x234},
|
||||
...])
|
||||
```
|
||||
|
||||
3. Миддл сообщает, какие документы поменяли имена/аватарки, присылает их, актуальная ли версия хранимого документа, и если нет, то какая актуальная (или массив хешей CRDT-изменений, которые нужно скачать для восстановления до актуальной версии)
|
||||
|
||||
```js
|
||||
Middle: Message StartUp reply (docs: [
|
||||
{root:0x345, status:last_version},
|
||||
{root:0x456, status:outdated, name:same, icon:b64(newIcon.png), lastVersion:0x789},
|
||||
...])
|
||||
```
|
||||
|
||||
4. Клиент применяет полученные изменения и отображает список документов
|
||||
|
||||
#### 3B. Получение списка документов (если store контролирует middle)
|
||||
Не вижу проблемы, если middle будет контролировать store. Плюсы – логика с клиента переходит на middle.
|
||||
|
||||
1. Юзер запустил приложение. Middle уже авторизован, пока ничего не отрисовано
|
||||
2. Клиент сообщает, что он запустился
|
||||
|
||||
```js
|
||||
Front: Message StartUp ()
|
||||
```
|
||||
|
||||
3. Middle отдает данные, которые нужно отрисовать на главной странице – список документов
|
||||
|
||||
```js
|
||||
Middle: Message DocumentsOrganizier (docs: [
|
||||
{name:'Doc 1', version:0x123, icon:icon1.png},
|
||||
{name:'Doc 2', version:0x234, icon:icon2.png},
|
||||
...])
|
||||
```
|
||||
|
||||
Логика по получению актуальных версий, сверки и прочего полностью абстрагирована от клиента.
|
||||
|
||||
4. Клиент просто отрисовывает полученные данные.
|
||||
|
||||
##### Cообщения сценария
|
||||
1. Сообщение, которым клиент сообщает, что ему нужен отрисовать список документов. Возникает в сценариях, когда мы на главном меню, плюс, возможно, в других сценариях (например, какое-то всплывающее контекстное меню, в котором отображаются документы).
|
||||
2. Сообщение, в котором middle передает список всех документов.
|
||||
|
||||
```js
|
||||
// С помощью запроса с entity == docHeaders можно запросить список документов
|
||||
// Выделять отдельное в сообщение DocumentsRequest не вижу смысла, оно слишком тривиальное получится
|
||||
message Request {
|
||||
string id = 0;
|
||||
string entity = 1;
|
||||
string target = 2;
|
||||
}
|
||||
|
||||
// когда приходит DocHeaders, автоматом на фронте отрисовывается соответствующий target с docHeaders.
|
||||
message DocHeaders {
|
||||
string id = 0;
|
||||
repeated DocHeader docHeaders = 1;
|
||||
}
|
||||
|
||||
message DocHeader {
|
||||
string id = 0;
|
||||
string name = 1;
|
||||
string root = 2;
|
||||
string version = 3;
|
||||
string iconName = 4;
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. Получение документа
|
||||
1. Юзер находится в главном меню и видит список документов. Юзер нажимает на один из них
|
||||
2. Клиент отправляет сообщение `Request { entity:document, target:0x123123 }`
|
||||
3. Middle отправляет сообщение `Document { root:0x123123, ..., blocks:[...] }`
|
||||
4. Клиент отрисовывает документ.
|
18
go.mod
18
go.mod
|
@ -1,6 +1,6 @@
|
|||
module github.com/anyproto/anytype-heart
|
||||
|
||||
go 1.19
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/JohannesKaufmann/html-to-markdown v1.3.7
|
||||
|
@ -14,7 +14,7 @@ require (
|
|||
github.com/chai2010/webp v1.1.1
|
||||
github.com/cheggaaa/mb v1.0.3
|
||||
github.com/cheggaaa/mb/v3 v3.0.1
|
||||
github.com/dave/jennifer v1.6.1
|
||||
github.com/dave/jennifer v1.7.0
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5
|
||||
github.com/dgraph-io/ristretto v0.1.1
|
||||
|
@ -49,11 +49,10 @@ require (
|
|||
github.com/ipfs/go-ds-flatfs v0.5.1
|
||||
github.com/ipfs/go-ipld-format v0.5.0
|
||||
github.com/ipfs/go-log v1.0.5
|
||||
github.com/ipfs/interface-go-ipfs-core v0.11.2
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e
|
||||
github.com/kelseyhightower/envconfig v1.4.0
|
||||
github.com/libp2p/go-libp2p v0.29.1
|
||||
github.com/libp2p/go-libp2p v0.29.2
|
||||
github.com/libp2p/zeroconf/v2 v2.2.0
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible
|
||||
github.com/magiconair/properties v1.8.7
|
||||
|
@ -78,12 +77,12 @@ require (
|
|||
github.com/stretchr/testify v1.8.4
|
||||
github.com/textileio/go-ds-badger3 v0.1.0
|
||||
github.com/uber/jaeger-client-go v2.30.0+incompatible
|
||||
github.com/vektra/mockery/v2 v2.32.3
|
||||
github.com/vektra/mockery/v2 v2.32.4
|
||||
github.com/yuin/goldmark v1.5.5
|
||||
go.uber.org/mock v0.2.0
|
||||
go.uber.org/multierr v1.11.0
|
||||
go.uber.org/zap v1.25.0
|
||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb
|
||||
golang.org/x/image v0.11.0
|
||||
golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda
|
||||
golang.org/x/net v0.14.0
|
||||
|
@ -175,7 +174,6 @@ require (
|
|||
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
|
||||
github.com/ipfs/go-log/v2 v2.5.1 // indirect
|
||||
github.com/ipfs/go-metrics-interface v0.0.1 // indirect
|
||||
github.com/ipfs/go-path v0.1.1 // indirect
|
||||
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
|
||||
github.com/ipld/go-ipld-prime v0.20.0 // indirect
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
||||
|
@ -197,7 +195,7 @@ require (
|
|||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/mschoch/smat v0.2.0 // indirect
|
||||
github.com/multiformats/go-base36 v0.2.0 // indirect
|
||||
github.com/multiformats/go-multiaddr v0.10.1 // indirect
|
||||
github.com/multiformats/go-multiaddr v0.11.0 // indirect
|
||||
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
||||
github.com/multiformats/go-multistream v0.4.1 // indirect
|
||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||
|
@ -209,7 +207,7 @@ require (
|
|||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.44.0 // indirect
|
||||
github.com/prometheus/procfs v0.10.1 // indirect
|
||||
github.com/prometheus/procfs v0.11.1 // indirect
|
||||
github.com/pseudomuto/protokit v0.2.0 // indirect
|
||||
github.com/rs/cors v1.7.0 // indirect
|
||||
github.com/rs/zerolog v1.29.0 // indirect
|
||||
|
@ -243,7 +241,7 @@ require (
|
|||
golang.org/x/sync v0.3.0 // indirect
|
||||
golang.org/x/sys v0.11.0 // indirect
|
||||
golang.org/x/term v0.11.0 // indirect
|
||||
golang.org/x/tools v0.11.0 // indirect
|
||||
golang.org/x/tools v0.12.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect
|
||||
|
|
455
go.sum
455
go.sum
|
@ -38,14 +38,11 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
|
|||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=
|
||||
filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
|
||||
github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
|
||||
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w=
|
||||
|
@ -58,13 +55,11 @@ github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVO
|
|||
github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
|
||||
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
|
||||
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 h1:zvgtcRb2B5gynWjm+Fc9oJZPHXwmcgyH0xCcNm6Rmo4=
|
||||
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786/go.mod h1:aKVJoQ0cc9K5Xb058XSnnAxXLliR97qbSqWBlm5ca1E=
|
||||
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
|
@ -79,8 +74,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h
|
|||
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
|
||||
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
|
||||
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
||||
github.com/anyproto/any-sync v0.2.17 h1:QqdXaByDpngaa7TgHtAsvg+LhfyQ8+hwvPJ5AIiOd2U=
|
||||
github.com/anyproto/any-sync v0.2.17/go.mod h1:c2DJ4p4PkfVlx4Or7SiIA0az+RlSWN9nfb35Wwn+FTM=
|
||||
github.com/anyproto/any-sync v0.2.21 h1:gQqABMwLB4Gp4Mqaa1e9FZ8he1sVuF6vrZVBmwMIAik=
|
||||
github.com/anyproto/any-sync v0.2.21/go.mod h1:0YJXL+UC9qXpSyjuN8ovEQLzVE9Sp4PPcA24lToG7ZQ=
|
||||
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
|
||||
github.com/anyproto/go-chash v0.1.0/go.mod h1:0UjNQi3PDazP0fINpFYu6VKhuna+W/V+1vpXHAfNgLY=
|
||||
github.com/anyproto/go-ds-badger3 v0.3.1-0.20230524095230-434cf6346d9b h1:SMizb43hfILk2bpMgpTd30n6yQQdxW0ZbDti0wqfsBw=
|
||||
|
@ -119,6 +114,7 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP
|
|||
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
||||
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
|
@ -158,19 +154,6 @@ github.com/blevesearch/zapx/v14 v14.3.9 h1:wuqxATgsTCNHM9xsOFOeFp8H2heZ/gMX/tsl9
|
|||
github.com/blevesearch/zapx/v14 v14.3.9/go.mod h1:MWZ4v8AzFBRurhDzkLvokFW8ljcq9Evm27mkWe8OGbM=
|
||||
github.com/blevesearch/zapx/v15 v15.3.12 h1:w/kU9aHyfMDEdwHGZzCiakC3HZ9z5gYlXaALDC4Dct8=
|
||||
github.com/blevesearch/zapx/v15 v15.3.12/go.mod h1:tx53gDJS/7Oa3Je820cmVurqCuJ4dqdAy1kiDMV/IUo=
|
||||
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
|
||||
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
||||
github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
||||
github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
||||
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
|
||||
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
|
||||
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
|
||||
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
|
||||
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
|
||||
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
|
||||
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
|
@ -204,13 +187,13 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE
|
|||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
|
||||
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
|
@ -221,31 +204,25 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
|
|||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
|
||||
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
|
||||
github.com/dave/jennifer v1.6.1 h1:T4T/67t6RAA5AIV6+NP8Uk/BIsXgDoqEowgycdQQLuk=
|
||||
github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
|
||||
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE=
|
||||
github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
|
||||
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I=
|
||||
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE=
|
||||
github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
|
||||
github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
|
||||
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
|
||||
github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU=
|
||||
github.com/dgraph-io/badger/v3 v3.0.0-20220429165824-bc74fea7d03b/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw=
|
||||
github.com/dgraph-io/ristretto v0.1.1-0.20220403145359-8e850b710d6d h1:Wrc3UKTS+cffkOx0xRGFC+ZesNuTfn0ThvEC72N0krk=
|
||||
github.com/dgraph-io/ristretto v0.1.1-0.20220403145359-8e850b710d6d/go.mod h1:RAy2GVV4sTWVlNMavv3xhLsk18rxhfhDnombTe6EF5c=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
|
@ -296,16 +273,17 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
|
|||
github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ=
|
||||
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
|
||||
github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
|
||||
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
|
||||
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
||||
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
|
@ -316,7 +294,6 @@ github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
|
|||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is=
|
||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
|
||||
github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk=
|
||||
github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||
|
@ -355,6 +332,7 @@ github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b/go.mod h1
|
|||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
|
||||
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
|
||||
|
@ -405,7 +383,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71
|
|||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
|
@ -447,8 +424,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
|
|||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
|
||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
|
@ -462,7 +439,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
|
|||
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA=
|
||||
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17 h1:0h35ESZ02+hN/MFZb7XZOXg+Rl9+Rk8fBIf5YLws9gA=
|
||||
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
|
@ -483,8 +461,8 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z
|
|||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q=
|
||||
github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
|
||||
github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
|
||||
|
@ -500,8 +478,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
|
|||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
|
||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
|
||||
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
|
||||
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
|
||||
github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
|
||||
github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
|
||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||
|
@ -524,7 +500,6 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09
|
|||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
|
@ -545,9 +520,8 @@ github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXM
|
|||
github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk=
|
||||
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
|
||||
github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY=
|
||||
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
|
||||
github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
|
||||
github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
|
||||
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
|
@ -560,131 +534,57 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
|
|||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||
github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
|
||||
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
|
||||
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
|
||||
github.com/ipfs/boxo v0.11.0 h1:urMxhZ3xoF4HssJVD3+0ssGT9pptEfHfbL8DYdoWFlg=
|
||||
github.com/ipfs/boxo v0.11.0/go.mod h1:8IfDmp+FzFGcF4zjAgHMVPpwYw4AjN9ePEzDfkaYJ1w=
|
||||
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
|
||||
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
|
||||
github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0=
|
||||
github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs=
|
||||
github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM=
|
||||
github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI=
|
||||
github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
|
||||
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
|
||||
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
|
||||
github.com/ipfs/go-block-format v0.1.2 h1:GAjkfhVx1f4YTODS6Esrj1wt2HhrtwTnhEr+DyPUaJo=
|
||||
github.com/ipfs/go-block-format v0.1.2/go.mod h1:mACVcrxarQKstUU3Yf/RdwbC4DzPV6++rO2a3d+a/KE=
|
||||
github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M=
|
||||
github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU=
|
||||
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
|
||||
github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
|
||||
github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
||||
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
||||
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
|
||||
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
|
||||
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
|
||||
github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
|
||||
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
|
||||
github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
|
||||
github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
|
||||
github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
|
||||
github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
|
||||
github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
|
||||
github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs=
|
||||
github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
|
||||
github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=
|
||||
github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8=
|
||||
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
|
||||
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
|
||||
github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8=
|
||||
github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s=
|
||||
github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE=
|
||||
github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk=
|
||||
github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4=
|
||||
github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4=
|
||||
github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
|
||||
github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s=
|
||||
github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s=
|
||||
github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
|
||||
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
|
||||
github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
|
||||
github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw=
|
||||
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
|
||||
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
|
||||
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
|
||||
github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo=
|
||||
github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs=
|
||||
github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM=
|
||||
github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0=
|
||||
github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
|
||||
github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY=
|
||||
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
|
||||
github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
|
||||
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
|
||||
github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms=
|
||||
github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k=
|
||||
github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs=
|
||||
github.com/ipfs/go-ipld-format v0.5.0 h1:WyEle9K96MSrvr47zZHKKcDxJ/vlpET6PSiQsAFO+Ds=
|
||||
github.com/ipfs/go-ipld-format v0.5.0/go.mod h1:ImdZqJQaEouMjCvqCe0ORUS+uoBmf7Hf+EO/jh+nk3M=
|
||||
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
|
||||
github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
|
||||
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
|
||||
github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk=
|
||||
github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
|
||||
github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs=
|
||||
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
|
||||
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
|
||||
github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
|
||||
github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M=
|
||||
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
|
||||
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
|
||||
github.com/ipfs/go-path v0.1.1 h1:0rfiI0IoNTYUyQN0ifz2zQBR6mZhOKv7qW5Jjx/4fG8=
|
||||
github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0=
|
||||
github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U=
|
||||
github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U=
|
||||
github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY=
|
||||
github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg=
|
||||
github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw=
|
||||
github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s=
|
||||
github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=
|
||||
github.com/ipfs/interface-go-ipfs-core v0.11.2 h1:vI9XEm9iC4iRNcyc8N4NkMdq4BvTYLBVxZC2uEd8HwU=
|
||||
github.com/ipfs/interface-go-ipfs-core v0.11.2/go.mod h1:xmnoccUXY7N/Q8AIx0vFqgW926/FAZ8+do/1NTEHKsU=
|
||||
github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
|
||||
github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
|
||||
github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
|
||||
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
|
||||
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
|
||||
github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g=
|
||||
github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M=
|
||||
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
|
||||
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||
github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA=
|
||||
github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
|
||||
github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs=
|
||||
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
|
||||
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs=
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
|
||||
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
|
||||
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
|
||||
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
|
||||
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
|
||||
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
|
||||
|
@ -694,7 +594,6 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
|||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
|
@ -706,214 +605,59 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
|
|||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e h1:LvL4XsI70QxOGHed6yhQtAU34Kx3Qq2wwBzGFKY8zKk=
|
||||
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
||||
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
|
||||
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
||||
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
||||
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
|
||||
github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
|
||||
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
|
||||
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
|
||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
|
||||
github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E=
|
||||
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
|
||||
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
|
||||
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
|
||||
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
||||
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
|
||||
github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc=
|
||||
github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU=
|
||||
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
|
||||
github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8=
|
||||
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
|
||||
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
|
||||
github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM=
|
||||
github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8=
|
||||
github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54=
|
||||
github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k=
|
||||
github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw=
|
||||
github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o=
|
||||
github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo=
|
||||
github.com/libp2p/go-libp2p v0.29.1 h1:yNeg6XgP8gbdc4YSrwiIt5T1TGOrVjH8dzl8h0GIOfQ=
|
||||
github.com/libp2p/go-libp2p v0.29.1/go.mod h1:20El+LLy3/YhdUYIvGbLnvVJN32nMdqY6KXBENRAfLY=
|
||||
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
|
||||
github.com/libp2p/go-libp2p v0.29.2 h1:uPw/c8hOxoLP/KhFnzlc5Ejqf+OmAL1dwIsqE31WBtY=
|
||||
github.com/libp2p/go-libp2p v0.29.2/go.mod h1:OU7nSq0aEZMsV2wY8nXn1+XNNt9q2UiR8LjW3Kmp2UE=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
|
||||
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
|
||||
github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE=
|
||||
github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI=
|
||||
github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI=
|
||||
github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A=
|
||||
github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk=
|
||||
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
|
||||
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
|
||||
github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ=
|
||||
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
|
||||
github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
|
||||
github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo=
|
||||
github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA=
|
||||
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
|
||||
github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco=
|
||||
github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE=
|
||||
github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I=
|
||||
github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI=
|
||||
github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0=
|
||||
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
|
||||
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
|
||||
github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII=
|
||||
github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0=
|
||||
github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0=
|
||||
github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
|
||||
github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
|
||||
github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM=
|
||||
github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
|
||||
github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
|
||||
github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
|
||||
github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
|
||||
github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
|
||||
github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg=
|
||||
github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
|
||||
github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90=
|
||||
github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo=
|
||||
github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE=
|
||||
github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo=
|
||||
github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek=
|
||||
github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw=
|
||||
github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw=
|
||||
github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
|
||||
github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM=
|
||||
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
|
||||
github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA=
|
||||
github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w=
|
||||
github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
|
||||
github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
|
||||
github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
|
||||
github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8=
|
||||
github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY=
|
||||
github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
|
||||
github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
|
||||
github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM=
|
||||
github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM=
|
||||
github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk=
|
||||
github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||
github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
|
||||
github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
|
||||
github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc=
|
||||
github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g=
|
||||
github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0=
|
||||
github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk=
|
||||
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
||||
github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU=
|
||||
github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4=
|
||||
github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4=
|
||||
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
|
||||
github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||
github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
|
||||
github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk=
|
||||
github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk=
|
||||
github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
|
||||
github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
|
||||
github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||
github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||
github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||
github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA=
|
||||
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
|
||||
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
|
||||
github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
|
||||
github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo=
|
||||
github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU=
|
||||
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
|
||||
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
|
||||
github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
|
||||
github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
|
||||
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
|
||||
github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
|
||||
github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0=
|
||||
github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
||||
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
||||
github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
||||
github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
||||
github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
|
||||
github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw=
|
||||
github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k=
|
||||
github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
|
||||
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
|
||||
github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA=
|
||||
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
|
||||
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
|
||||
github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0=
|
||||
github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M=
|
||||
github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc=
|
||||
github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
|
||||
github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM=
|
||||
github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk=
|
||||
github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA=
|
||||
github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
|
||||
github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
|
||||
github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI=
|
||||
github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
|
||||
github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U=
|
||||
github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
|
||||
github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ=
|
||||
github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
||||
|
@ -924,17 +668,12 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q
|
|||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
|
@ -949,24 +688,15 @@ github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d h1:eAS2t2Vy+6psf9LZ4T5WXW
|
|||
github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d/go.mod h1:3YMHqrw2Qu3Liy82v4QdAG17e9k91HZ7w3hqlpWqhDo=
|
||||
github.com/mehanizm/dateparse v0.0.0-20210806203422-f82c8742c9f8 h1:SA/3Lk2gFZilCejaXeCTkA3+MHt9uI9ogzx45F/nOFE=
|
||||
github.com/mehanizm/dateparse v0.0.0-20210806203422-f82c8742c9f8/go.mod h1:cBDq2yLJ1Hr7GOJxsu46m4vzUyPslmbimCrvSg6wxXU=
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||
github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg=
|
||||
github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
|
||||
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
||||
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
|
||||
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
||||
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
||||
github.com/miolini/datacounter v1.0.3 h1:tanOZPVblGXQl7/bSZWoEM8l4KK83q24qwQLMrO/HOA=
|
||||
|
@ -990,8 +720,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
|
|||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
|
||||
github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
|
||||
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
||||
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
|
@ -1003,40 +731,19 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
|
|||
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
|
||||
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
||||
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
||||
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||
github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0=
|
||||
github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
|
||||
github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
|
||||
github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q=
|
||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
||||
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
|
||||
github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
|
||||
github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
|
||||
github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA=
|
||||
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
|
||||
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
|
||||
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
|
||||
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
|
||||
github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
|
||||
github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
|
||||
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
|
||||
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
|
||||
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
||||
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
|
||||
github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
|
||||
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
|
||||
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
|
||||
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
|
||||
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
|
||||
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||
github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38=
|
||||
github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
|
||||
github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo=
|
||||
github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q=
|
||||
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
|
||||
|
@ -1057,23 +764,18 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
|
|||
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
|
||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
|
@ -1094,6 +796,7 @@ github.com/otiai10/marmoset v0.4.0/go.mod h1:t2q6dXWZ9YcFdRREDApX4bCmfQnL3isJ2dg
|
|||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
||||
github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
||||
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
|
||||
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||
github.com/otiai10/opengraph/v2 v2.1.0 h1:rsrq/Krr4E6IPMPUdJ+pit4mc8ijzH9P7eyfEqvlUBI=
|
||||
github.com/otiai10/opengraph/v2 v2.1.0/go.mod h1:gHYa6c2GENKqbB7O6Mkqpq2Ma0Nti31xIM/3QHNcD/M=
|
||||
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||
|
@ -1115,9 +818,6 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J
|
|||
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
|
||||
github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
|
||||
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
|
||||
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
|
||||
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
|
@ -1155,23 +855,27 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
|
|||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
|
||||
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
|
||||
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
|
||||
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w=
|
||||
github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM=
|
||||
github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM=
|
||||
github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.3 h1:m575dovXn1y2ATOb1XrRFcrv0F+EQmlowTkoraNkDPI=
|
||||
github.com/quic-go/quic-go v0.36.3 h1:f+yOqeGhMoRX7/M3wmEw/djhzKWr15FtQysox85/834=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.2 h1:rRgN3WfnKbyik4dBV8A6girlJVxGand/d+jVKbQq5GI=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.2/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.37.4 h1:ke8B73yMCWGq9MfrCCAw0Uzdm7GaViC3i39dsIdDlH4=
|
||||
github.com/quic-go/quic-go v0.37.4/go.mod h1:YsbH1r4mSHPJcLF4k4zruUkLBqctEMBDR6VPvcYjIsU=
|
||||
github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU=
|
||||
github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
|
||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
|
@ -1211,19 +915,13 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic
|
|||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||
github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
|
||||
github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
|
||||
github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
|
||||
github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
||||
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
|
||||
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
|
@ -1249,7 +947,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
|
|||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
|
||||
github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
|
||||
github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
|
||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||
|
@ -1271,7 +968,6 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
|
|||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
|
||||
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/textileio/go-datastore-extensions v1.1.0 h1:rU2oz3iZ50eukiWztXsG3FmSAKwUvIGH1sRv//QXoDs=
|
||||
github.com/textileio/go-datastore-extensions v1.1.0/go.mod h1:+LryCa08vOxyo7RwPIshXCqE7TnyV1QyrJ1fQtCipVo=
|
||||
github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160 h1:NSWpaDaurcAJY7PkL8Xt0PhZE7qpvbZl5ljd8r6U0bI=
|
||||
|
@ -1297,25 +993,14 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
|
|||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/vektra/mockery/v2 v2.32.3 h1:ugtC6b34me/NenXXNR0Pr8UOKTllYodxyeyq0B/ak98=
|
||||
github.com/vektra/mockery/v2 v2.32.3/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM=
|
||||
github.com/vektra/mockery/v2 v2.32.4 h1:EHvss3EWCXf8BmKw8YZFBtXFSVVusq5n1TiAQg896bM=
|
||||
github.com/vektra/mockery/v2 v2.32.4/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM=
|
||||
github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U=
|
||||
github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/warpfork/go-testmark v0.11.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
|
||||
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
|
||||
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
|
||||
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
|
||||
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
|
||||
github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=
|
||||
github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE=
|
||||
github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8=
|
||||
github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA=
|
||||
github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
|
||||
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
|
||||
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
|
@ -1331,6 +1016,7 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi
|
|||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
|
||||
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg=
|
||||
github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
|
||||
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
|
||||
|
@ -1346,7 +1032,6 @@ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
|||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
|
@ -1365,10 +1050,10 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
|||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
|
||||
go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU=
|
||||
go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
|
@ -1380,34 +1065,22 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
|
|||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
|
||||
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
|
||||
go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
|
||||
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
|
||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
|
@ -1427,8 +1100,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
|
||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
|
||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
|
@ -1467,7 +1140,6 @@ golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -1475,20 +1147,17 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
|
@ -1561,30 +1230,18 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -1617,7 +1274,6 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -1643,7 +1299,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
|
@ -1669,7 +1324,6 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
@ -1694,7 +1348,6 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn
|
|||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
|
@ -1729,8 +1382,8 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
|
||||
golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
|
||||
golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
|
||||
golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -1770,7 +1423,6 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6
|
|||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
|
@ -1830,7 +1482,6 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
|
|||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||
google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
|
@ -1853,7 +1504,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
|
|||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
|
@ -1862,6 +1512,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
|
|||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
|
@ -1869,8 +1520,6 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
|||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
|
||||
gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
|
|
|
@ -71,7 +71,7 @@ func parseInterfaceName(name string) (prefix string, bus int, num int64) {
|
|||
}
|
||||
|
||||
func (i InterfacesAddrs) SortWithPriority(priority []string) {
|
||||
slices.SortFunc(i.Interfaces, func(a, b net.Interface) bool {
|
||||
less := func(a, b net.Interface) bool {
|
||||
aPrefix, aBus, aNum := parseInterfaceName(a.Name)
|
||||
bPrefix, bBus, bNum := parseInterfaceName(b.Name)
|
||||
|
||||
|
@ -99,6 +99,12 @@ func (i InterfacesAddrs) SortWithPriority(priority []string) {
|
|||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
slices.SortFunc(i.Interfaces, func(a, b net.Interface) int {
|
||||
if less(a, b) {
|
||||
return -1
|
||||
}
|
||||
return 1
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"path/filepath"
|
||||
"sync"
|
||||
|
||||
"github.com/anyproto/any-sync/app"
|
||||
"github.com/anyproto/anytype-heart/core/wallet"
|
||||
)
|
||||
|
||||
|
@ -20,10 +21,17 @@ type TempDirService struct {
|
|||
tempDir string
|
||||
}
|
||||
|
||||
func NewTempDirService(wallet wallet.Wallet) *TempDirService {
|
||||
return &TempDirService{
|
||||
wallet: wallet,
|
||||
}
|
||||
func NewTempDirService() *TempDirService {
|
||||
return &TempDirService{}
|
||||
}
|
||||
|
||||
func (s *TempDirService) Init(a *app.App) error {
|
||||
s.wallet = app.MustComponent[wallet.Wallet](a)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *TempDirService) Name() string {
|
||||
return "core.tmpdir"
|
||||
}
|
||||
|
||||
func (s *TempDirService) TempDir() string {
|
||||
|
|
2164
pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go
Normal file
2164
pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go
Normal file
File diff suppressed because it is too large
Load diff
|
@ -60,10 +60,8 @@ var (
|
|||
_ ObjectStore = (*dsObjectStore)(nil)
|
||||
)
|
||||
|
||||
func New(sbtProvider typeprovider.SmartBlockTypeProvider) ObjectStore {
|
||||
return &dsObjectStore{
|
||||
sbtProvider: sbtProvider,
|
||||
}
|
||||
func New() ObjectStore {
|
||||
return &dsObjectStore{}
|
||||
}
|
||||
|
||||
type SourceDetailsFromID interface {
|
||||
|
@ -71,6 +69,7 @@ type SourceDetailsFromID interface {
|
|||
}
|
||||
|
||||
func (s *dsObjectStore) Init(a *app.App) (err error) {
|
||||
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
|
||||
src := a.Component("source")
|
||||
if src != nil {
|
||||
s.sourceService = a.MustComponent("source").(SourceDetailsFromID)
|
||||
|
|
|
@ -11,14 +11,12 @@ import (
|
|||
|
||||
commonspace "github.com/anyproto/any-sync/commonspace"
|
||||
headsync "github.com/anyproto/any-sync/commonspace/headsync"
|
||||
list "github.com/anyproto/any-sync/commonspace/object/acl/list"
|
||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||
objectsync "github.com/anyproto/any-sync/commonspace/objectsync"
|
||||
objecttreebuilder "github.com/anyproto/any-sync/commonspace/objecttreebuilder"
|
||||
spacestorage "github.com/anyproto/any-sync/commonspace/spacestorage"
|
||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||
syncstatus "github.com/anyproto/any-sync/commonspace/syncstatus"
|
||||
peer "github.com/anyproto/any-sync/net/peer"
|
||||
gomock "go.uber.org/mock/gomock"
|
||||
)
|
||||
|
||||
|
@ -45,20 +43,6 @@ func (m *MockSpace) EXPECT() *MockSpaceMockRecorder {
|
|||
return m.recorder
|
||||
}
|
||||
|
||||
// Acl mocks base method.
|
||||
func (m *MockSpace) Acl() list.AclList {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Acl")
|
||||
ret0, _ := ret[0].(list.AclList)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Acl indicates an expected call of Acl.
|
||||
func (mr *MockSpaceMockRecorder) Acl() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Acl", reflect.TypeOf((*MockSpace)(nil).Acl))
|
||||
}
|
||||
|
||||
// Close mocks base method.
|
||||
func (m *MockSpace) Close() error {
|
||||
m.ctrl.T.Helper()
|
||||
|
@ -130,21 +114,6 @@ func (mr *MockSpaceMockRecorder) Description() *gomock.Call {
|
|||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Description", reflect.TypeOf((*MockSpace)(nil).Description))
|
||||
}
|
||||
|
||||
// GetNodePeers mocks base method.
|
||||
func (m *MockSpace) GetNodePeers(arg0 context.Context) ([]peer.Peer, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "GetNodePeers", arg0)
|
||||
ret0, _ := ret[0].([]peer.Peer)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// GetNodePeers indicates an expected call of GetNodePeers.
|
||||
func (mr *MockSpaceMockRecorder) GetNodePeers(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodePeers", reflect.TypeOf((*MockSpace)(nil).GetNodePeers), arg0)
|
||||
}
|
||||
|
||||
// HandleMessage mocks base method.
|
||||
func (m *MockSpace) HandleMessage(arg0 context.Context, arg1 objectsync.HandleMessage) error {
|
||||
m.ctrl.T.Helper()
|
||||
|
|
|
@ -46,10 +46,8 @@ type provider struct {
|
|||
cache map[string]smartblock.SmartBlockType
|
||||
}
|
||||
|
||||
func New(spaceService space.Service) SmartBlockTypeProvider {
|
||||
return &provider{
|
||||
spaceService: spaceService,
|
||||
}
|
||||
func New() SmartBlockTypeProvider {
|
||||
return &provider{}
|
||||
}
|
||||
|
||||
var badgerPrefix = []byte("typeprovider/")
|
||||
|
@ -60,7 +58,7 @@ func (p *provider) Init(a *app.App) (err error) {
|
|||
if err != nil {
|
||||
return fmt.Errorf("get badger storage: %w", err)
|
||||
}
|
||||
// TODO I forgot why we need this
|
||||
// TODO multi-space: I forgot why we need this
|
||||
err = p.badger.View(func(txn *badger.Txn) error {
|
||||
opts := badger.DefaultIteratorOptions
|
||||
opts.Prefix = badgerPrefix
|
||||
|
@ -84,6 +82,7 @@ func (p *provider) Init(a *app.App) (err error) {
|
|||
if err != nil {
|
||||
return fmt.Errorf("init cache from badger: %w", err)
|
||||
}
|
||||
p.spaceService = app.MustComponent[space.Service](a)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -75,11 +75,11 @@ type builtinObjects struct {
|
|||
coreService core.Service
|
||||
importer importer.Importer
|
||||
store objectstore.ObjectStore
|
||||
tempDirService *core.TempDirService
|
||||
tempDirService core.TempDirProvider
|
||||
}
|
||||
|
||||
func New(tempDirService *core.TempDirService) BuiltinObjects {
|
||||
return &builtinObjects{tempDirService: tempDirService}
|
||||
func New() BuiltinObjects {
|
||||
return &builtinObjects{}
|
||||
}
|
||||
|
||||
func (b *builtinObjects) Init(a *app.App) (err error) {
|
||||
|
@ -87,6 +87,7 @@ func (b *builtinObjects) Init(a *app.App) (err error) {
|
|||
b.coreService = a.MustComponent(core.CName).(core.Service)
|
||||
b.importer = a.MustComponent(importer.CName).(importer.Importer)
|
||||
b.store = app.MustComponent[objectstore.ObjectStore](a)
|
||||
b.tempDirService = app.MustComponent[core.TempDirProvider](a)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -51,8 +51,13 @@ type unsplashService struct {
|
|||
tempDirProvider core.TempDirProvider
|
||||
}
|
||||
|
||||
func (l *unsplashService) Init(app *app.App) (err error) {
|
||||
func New() Unsplash {
|
||||
return &unsplashService{}
|
||||
}
|
||||
|
||||
func (l *unsplashService) Init(a *app.App) (err error) {
|
||||
l.cache = ocache.New(l.search, ocache.WithTTL(cacheTTL), ocache.WithGCPeriod(cacheGCPeriod))
|
||||
l.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -60,10 +65,6 @@ func (l *unsplashService) Name() (name string) {
|
|||
return CName
|
||||
}
|
||||
|
||||
func New(tempDirProvider core.TempDirProvider) Unsplash {
|
||||
return &unsplashService{tempDirProvider: tempDirProvider}
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
ID string
|
||||
Description string
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue