feat: expose result subscription HTTP and WebSocket APIs

This commit is contained in:
2026-09-17 19:57:55 +08:00
parent 1c3300cc5b
commit 8485a662b2
38 changed files with 3462 additions and 26 deletions

96
sdk/go/subscriptions.go Normal file
View File

@@ -0,0 +1,96 @@
package orbit
import (
"context"
"errors"
"net/url"
"strconv"
)
// CreateSubscription 保留原幂等键和请求内容重报;SDK不会自动生成新键或重新指定起点。
func (c *Client) CreateSubscription(ctx context.Context, key string, in CreateSubscriptionRequest) (SubscriptionResult, error) {
var out SubscriptionResult
if !validID(in.QueueID) {
return out, errors.New("invalid queue id")
}
err := c.call(ctx, "POST", "/v1/subscriptions", key, in, &out)
return out, err
}
func (c *Client) GetSubscription(ctx context.Context, id string) (Subscription, error) {
var out Subscription
if !validID(id) {
return out, errors.New("invalid subscription id")
}
err := c.call(ctx, "GET", "/v1/subscriptions/"+id, "", nil, &out)
return out, err
}
func (c *Client) ConfigureSubscription(ctx context.Context, id, key string, in ConfigureSubscriptionRequest) (SubscriptionResult, error) {
var out SubscriptionResult
if !validID(id) {
return out, errors.New("invalid subscription id")
}
err := c.call(ctx, "POST", "/v1/subscriptions/"+id+":configure", key, in, &out)
return out, err
}
func (c *Client) ListSubscriptions(ctx context.Context, queue string, in SubscriptionPageRequest) (SubscriptionPage, error) {
var out SubscriptionPage
if !validID(queue) {
return out, errors.New("invalid queue id")
}
q, err := subscriptionQuery(in.Limit, in.Cursor)
if err != nil {
return out, err
}
q.Set("queue_id", queue)
err = c.call(ctx, "GET", "/v1/subscriptions?"+q.Encode(), "", nil, &out)
return out, err
}
func (c *Client) ListEventDeliveries(ctx context.Context, id string, in DeliveryPageRequest) (DeliveryPage, error) {
var out DeliveryPage
if !validID(id) {
return out, errors.New("invalid subscription id")
}
q, err := subscriptionQuery(in.Limit, in.Cursor)
if err != nil {
return out, err
}
switch in.State {
case "", DeliveryPending, DeliveryLeased, DeliveryAcked, DeliveryExpired:
default:
return out, errors.New("invalid delivery state")
}
if in.State != "" {
q.Set("state", string(in.State))
}
err = c.call(ctx, "GET", "/v1/subscriptions/"+id+"/deliveries?"+q.Encode(), "", nil, &out)
return out, err
}
func (c *Client) GetEventDelivery(ctx context.Context, sub, id string) (DeliveryDetail, error) {
var out DeliveryDetail
if !validID(sub) || !validID(id) {
return out, errors.New("invalid subscription or delivery id")
}
err := c.call(ctx, "GET", "/v1/subscriptions/"+sub+"/deliveries/"+id, "", nil, &out)
return out, err
}
func (c *Client) RetryEventDelivery(ctx context.Context, sub, id, key string, in RetryDeliveryRequest) (RetryDeliveryResult, error) {
var out RetryDeliveryResult
if !validID(sub) || !validID(id) {
return out, errors.New("invalid subscription or delivery id")
}
err := c.call(ctx, "POST", "/v1/subscriptions/"+sub+"/deliveries/"+id+":retry", key, in, &out)
return out, err
}
func subscriptionQuery(limit int, cursor string) (url.Values, error) {
q := url.Values{}
if limit < 0 || limit > 100 || len(cursor) > 2048 {
return nil, errors.New("invalid subscription page")
}
if limit != 0 {
q.Set("limit", strconv.Itoa(limit))
}
if cursor != "" {
q.Set("cursor", cursor)
}
return q, nil
}