From 427cc77fa3633aca7c4c3377fa26b0e70921a7b5 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Mon, 6 May 2024 00:18:22 +0200 Subject: [golang] bootstrapped a client in yet another language --- golang/pkg/api/client.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 golang/pkg/api/client.go (limited to 'golang/pkg/api/client.go') diff --git a/golang/pkg/api/client.go b/golang/pkg/api/client.go new file mode 100644 index 0000000..70f3e68 --- /dev/null +++ b/golang/pkg/api/client.go @@ -0,0 +1,75 @@ +package api + +import ( + "container/heap" + "context" + "net/http" + "time" +) + +type Client struct { + baseURL string + channel chan *Request + ctx context.Context + headers *http.Header + httpClient *http.Client + pq *PriorityQueue +} + +func NewClient(ctx context.Context) *Client { + pq := make(PriorityQueue, 0) + heap.Init(&pq) + client := &Client{ + baseURL: "https://api.spacetraders.io/v2", + channel: make(chan *Request), + ctx: ctx, + headers: &http.Header{ + "Content-Type": {"application/json"}, + }, + httpClient: &http.Client{ + Timeout: time.Minute, + }, + pq: &pq, + } + go queueProcessor(client) + return client +} + +func (c *Client) Close() { + close(c.channel) +} + +func (c *Client) SetToken(token string) { + c.headers.Set("Authorization", "Bearer "+token) +} + +func queueProcessor(client *Client) { + var ok bool + for { + // The queue is empty so we do this blocking call + req := <-client.channel + heap.Push(client.pq, req) + // we enqueue all values read from the channel and process the queue's + // contents until empty. We keep reading the channel as long as this + // emptying goes on + for { + select { + case req = <-client.channel: + heap.Push(client.pq, req) + default: + if client.pq.Len() == 0 { + break + } + // we process one + if req, ok = heap.Pop(client.pq).(*Request); !ok { + panic("queueProcessor got something other than a Request on its channel") + } + response, err := client.sendOne(req.method, req.path, req.payload) + req.resp <- &Response{ + Response: response, + Err: err, + } + } + } + } +} -- cgit v1.2.3