Skip to content

Commit 3cf5713

Browse files
committed
peersync: add cohesive sync package
Introduce a flattened peersync package that consolidates the prior application, domain, and infrastructure layers for peer capability sync. Provide value objects, sync loop, supervisor, and store primitives alongside gomock-compatible adapters. - Add peer state, storage, and supervisor implementations - Port existing tests to peersync with stubbed adapters - Publish gomock mocks and README guidance for integrators
1 parent 569b7be commit 3cf5713

File tree

13 files changed

+2394
-0
lines changed

13 files changed

+2394
-0
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ require (
163163
github.com/docker/go-units v0.5.0 // indirect
164164
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
165165
github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
166+
github.com/golang/mock v1.6.0 // indirect
166167
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
167168
github.com/google/uuid v1.6.0 // indirect
168169
github.com/hashicorp/errwrap v1.1.0 // indirect

go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
256256
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
257257
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
258258
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
259+
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
260+
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
259261
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
260262
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
261263
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -947,6 +949,7 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc
947949
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
948950
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
949951
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
952+
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
950953
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
951954
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
952955
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=

peersync/README.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# peersync パッケージ
2+
3+
`github.com/elementsproject/peerswap/peersync` は、PeerSwap ノード間でピア能力情報を同期するための実装を提供します。DDD 風に分割されていた `application``domain``infrastructure` 層を統合し、機能別にフラットな構成へと整理されています。
4+
5+
- コアロジックと値オブジェクトはすべて同じパッケージで完結
6+
- 最小限のポート/アダプタ(`Store`, `Lightning`, `PolicyService`)を実装するだけでアプリケーションサービスが利用可能
7+
- 既存テストは `peersync/*_test.go` にまとまり、モックよりシンプルなスタブ構成
8+
9+
## 主なファイル
10+
11+
- `peer.go`:ピア・アセット・プレミアムレートなどの値オブジェクト群
12+
- `peersync.go`:カスタムメッセージを使った同期ループ (`PeerSync`)
13+
- `ports.go`:外部と接続するためのインターフェース境界
14+
- `supervisor.go`:同期ループを監視するスーパーバイザ
15+
- `*_test.go`:スタブを使ったユニットテスト
16+
- `mocks/ports.go`:外部利用者向けに残した gomock 版ポートモック
17+
18+
## 使い方
19+
20+
1. 任意のバイナリ/プラグインから `peersync` パッケージをインポートします。
21+
2. `Store`, `Lightning`, `PolicyService` を満たすアダプタを用意します。
22+
3. `NewPeerSync` に各アダプタと `PeerID` を渡し、`Start` を呼び出します。
23+
4. 必要であれば `Supervisor` を用いて自動再起動やバックオフ制御を追加できます。
24+
25+
```go
26+
package main
27+
28+
import (
29+
"context"
30+
"log"
31+
32+
"github.com/elementsproject/peerswap/peersync"
33+
)
34+
35+
func main() {
36+
nodeID, err := peersync.NewPeerID("my-node")
37+
if err != nil {
38+
log.Fatalf("invalid peer id: %v", err)
39+
}
40+
41+
syncer := peersync.NewPeerSync(
42+
nodeID,
43+
&myStore{}, // peersync.Store
44+
&myLightning{}, // peersync.Lightning (custom messages + peers)
45+
&myPolicyService{}, // peersync.PolicyService
46+
)
47+
48+
ctx := context.Background()
49+
if err := syncer.Start(ctx); err != nil {
50+
log.Fatalf("sync failed: %v", err)
51+
}
52+
}
53+
```
54+
55+
### ポートインターフェース概要
56+
57+
| インターフェース | 主な役割 |
58+
|------------------|-----------|
59+
| `Store` | ピア状態の永続化・取得・クリーンアップ |
60+
| `Lightning` | Custom message の送受信と接続 peer 列挙(lnd/cln に橋渡し) |
61+
| `PolicyService` | 通信可否や受信許可のポリシー判定 |
62+
63+
## テスト
64+
65+
`peersync` 配下の変更は下記で検証できます。
66+
67+
```bash
68+
go test ./peersync/...
69+
```
70+
71+
各テストでは gomock ではなくスタブ実装を用いているため、追加アダプタの例としても参照できます。
72+
73+
## 参考リンク
74+
75+
- ルート README: [`../README.md`](../README.md)
76+
- プロトコル仕様ドラフト: [`../docs/peer-protocol.md`](../docs/peer-protocol.md)

peersync/mocks/ports.go

Lines changed: 154 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)