@@ -2,7 +2,10 @@ package api
2
2
3
3
import (
4
4
"errors"
5
+ "fmt"
6
+ "net"
5
7
"net/http"
8
+ "os"
6
9
7
10
"github.com/tonkeeper/tongo/config"
8
11
"go.uber.org/zap"
@@ -93,7 +96,7 @@ func WithMemPool(memPool sources.MemPoolSource) ServerOption {
93
96
}
94
97
}
95
98
96
- func NewServer (log * zap.Logger , handler * Handler , address string , opts ... ServerOption ) (* Server , error ) {
99
+ func NewServer (log * zap.Logger , handler * Handler , opts ... ServerOption ) (* Server , error ) {
97
100
options := & ServerOptions {}
98
101
for _ , o := range opts {
99
102
o (options )
@@ -137,7 +140,6 @@ func NewServer(log *zap.Logger, handler *Handler, address string, opts ...Server
137
140
mux : mux ,
138
141
asyncMiddlewares : asyncMiddlewares ,
139
142
httpServer : & http.Server {
140
- Addr : address ,
141
143
Handler : mux ,
142
144
},
143
145
}
@@ -161,11 +163,39 @@ func (s *Server) RegisterAsyncHandler(pattern string, handler AsyncHandler, conn
161
163
s .mux .Handle (pattern , wrapAsync (connectionType , allowTokenInQuery , chainMiddlewares (handler , s .asyncMiddlewares ... )))
162
164
}
163
165
164
- func (s * Server ) Run () {
165
- err := s .httpServer .ListenAndServe ()
166
- if errors .Is (err , http .ErrServerClosed ) {
167
- s .logger .Warn ("opentonapi quit" )
168
- return
169
- }
170
- s .logger .Fatal ("ListedAndServe() failed" , zap .Error (err ))
166
+ func (s * Server ) Run (address string , unixSockets []string ) {
167
+ go func () {
168
+ tcpListener , err := net .Listen ("tcp" , address )
169
+ if err != nil {
170
+ s .logger .Fatal ("Failed to listen on tcp address" , zap .Error (err ))
171
+ }
172
+ err = s .httpServer .Serve (tcpListener )
173
+
174
+ if errors .Is (err , http .ErrServerClosed ) {
175
+ s .logger .Warn ("opentonapi quit" )
176
+ return
177
+ }
178
+ s .logger .Fatal ("ListenAndServe() failed" , zap .Error (err ))
179
+ }()
180
+
181
+ for _ , socketPath := range unixSockets {
182
+ go func (socketPath string ) {
183
+ if _ , err := os .Stat (socketPath ); err == nil {
184
+ os .Remove (socketPath )
185
+ }
186
+
187
+ unixListener , err := net .Listen ("unix" , socketPath )
188
+ if err != nil {
189
+ s .logger .Fatal (fmt .Sprintf ("Failed to listen on Unix socket %v" , socketPath ), zap .Error (err ))
190
+ }
191
+
192
+ err = s .httpServer .Serve (unixListener )
193
+ if errors .Is (err , http .ErrServerClosed ) {
194
+ s .logger .Warn ("opentonapi quit" )
195
+ return
196
+ }
197
+ s .logger .Fatal (fmt .Sprintf ("ListenAndServe() failed for %v" , socketPath ), zap .Error (err ))
198
+ }(socketPath )
199
+ }
200
+ <- make (chan struct {})
171
201
}
0 commit comments