-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathurl.go
110 lines (90 loc) · 2.37 KB
/
url.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package stream
import (
"fmt"
"os"
)
const domain = "stream-io-api.com"
type urlBuilder interface {
url() string
}
// handy rewrites for regions
var regionOverrides = map[string]string{
"us-east": "us-east-api",
"eu-west": "eu-west-api",
"singapore": "singapore-api",
}
var personalizationOverrides = map[string]string{
"eu-west": "dublin",
"dublin": "dublin",
}
type regionalURLBuilder struct {
region string
version string
}
func newRegionalURLBuilder(region, version string) regionalURLBuilder {
return regionalURLBuilder{
region: region,
version: version,
}
}
func (u regionalURLBuilder) makeHost(subdomain string) string {
if envHost := os.Getenv("STREAM_URL"); envHost != "" {
return envHost
}
return fmt.Sprintf("https://%s.%s", u.makeRegion(subdomain), domain)
}
func (u regionalURLBuilder) makeVersion() string {
if u.version != "" {
return u.version
}
return "1.0"
}
func (u regionalURLBuilder) makeRegion(subdomain string) string {
if u.region != "" {
if override, ok := regionOverrides[u.region]; ok {
return override
}
return u.region
}
return subdomain
}
type apiURLBuilder struct {
addr string
regionalURLBuilder
}
func newAPIURLBuilder(addr, region, version string) apiURLBuilder {
return apiURLBuilder{addr, newRegionalURLBuilder(region, version)}
}
func (u apiURLBuilder) url() string {
if u.addr != "" {
return fmt.Sprintf("%s/api/v%s/", u.addr, u.makeVersion())
}
return fmt.Sprintf("%s/api/v%s/", u.makeHost("api"), u.makeVersion())
}
type personalizationURLBuilder struct {
region string
}
func newPersonalizationURLBuilder(region string) personalizationURLBuilder {
return personalizationURLBuilder{
region: region,
}
}
func (b personalizationURLBuilder) url() string {
if envHost := os.Getenv("STREAM_URL"); envHost != "" {
return envHost
}
defaultPath := fmt.Sprintf("personalization.%s/personalization/v1.0/", domain)
if override, ok := personalizationOverrides[b.region]; ok {
return fmt.Sprintf("https://%s-%s", override, defaultPath)
}
return fmt.Sprintf("https://%s", defaultPath)
}
type analyticsURLBuilder struct {
regionalURLBuilder
}
func newAnalyticsURLBuilder(region, version string) analyticsURLBuilder {
return analyticsURLBuilder{newRegionalURLBuilder(region, version)}
}
func (u analyticsURLBuilder) url() string {
return fmt.Sprintf("%s/analytics/v%s/", u.makeHost("analytics"), u.makeVersion())
}