Skip to content

Commit e74e613

Browse files
committed
Support publishableKey
1 parent c4d6df7 commit e74e613

27 files changed

+365
-340
lines changed

generate-routes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,11 @@ import {
256256
type SeamHttpOptionsWithClientSessionToken,
257257
} from 'lib/seam/connect/options.js'
258258
import { parseOptions } from 'lib/seam/connect/parse-options.js'
259+
259260
${
260261
namespace === 'client_sessions'
261262
? ''
262-
: "import { SeamHttpClientSessions } from 'lib/seam/connect/routes/client-sessions.js'"
263+
: "import { SeamHttpClientSessions } from './client-sessions.js'"
263264
}
264265
${subresources
265266
.map((subresource) => renderSubresourceImport(subresource, namespace))

src/lib/seam/connect/auth.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ import {
22
isSeamHttpOptionsWithApiKey,
33
isSeamHttpOptionsWithClientSessionToken,
44
SeamHttpInvalidOptionsError,
5-
type SeamHttpOptions,
65
type SeamHttpOptionsWithApiKey,
76
type SeamHttpOptionsWithClientSessionToken,
87
} from './options.js'
8+
import type { Options } from './parse-options.js'
99

1010
type Headers = Record<string, string>
1111

12-
export const getAuthHeaders = (
13-
options: SeamHttpOptions | { publishableKey: string },
14-
): Headers => {
12+
export const getAuthHeaders = (options: Options): Headers => {
1513
if ('publishableKey' in options) {
1614
return getAuthHeadersForPublishableKey(options.publishableKey)
1715
}

src/lib/seam/connect/client.ts

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,22 @@ import axiosRetry, { type AxiosRetry, exponentialDelay } from 'axios-retry'
33

44
import { paramsSerializer } from 'lib/params-serializer.js'
55

6-
import { getAuthHeaders } from './auth.js'
7-
import {
8-
isSeamHttpOptionsWithClient,
9-
isSeamHttpOptionsWithClientSessionToken,
10-
type SeamHttpOptions,
11-
} from './options.js'
12-
136
export type Client = Axios
147

158
export interface ClientOptions {
16-
endpoint?: string
179
axiosOptions?: AxiosRequestConfig
1810
axiosRetryOptions?: AxiosRetryConfig
11+
client?: Client
1912
}
2013

2114
type AxiosRetryConfig = Parameters<AxiosRetry>[1]
2215

23-
type Options =
24-
| Required<SeamHttpOptions>
25-
| (Required<ClientOptions> & { publishableKey: string })
26-
27-
export const createClient = (options: Options): Axios => {
28-
if (isSeamHttpOptionsWithClient(options)) return options.client
16+
export const createClient = (options: ClientOptions): Axios => {
17+
if (options.client != null) return options.client
2918

3019
const client = axios.create({
31-
baseURL: options.endpoint,
32-
withCredentials: isSeamHttpOptionsWithClientSessionToken(options),
3320
paramsSerializer,
3421
...options.axiosOptions,
35-
headers: {
36-
...getAuthHeaders(options),
37-
...options.axiosOptions.headers,
38-
},
3922
})
4023

4124
axiosRetry(client, {

src/lib/seam/connect/options.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ export type SeamHttpOptions =
66
| SeamHttpOptionsWithApiKey
77
| SeamHttpOptionsWithClientSessionToken
88

9-
type SeamHttpCommonOptions = ClientOptions
9+
interface SeamHttpCommonOptions extends ClientOptions {
10+
endpoint?: string
11+
}
1012

1113
export type SeamHttpOptionsFromEnv = SeamHttpCommonOptions
1214

src/lib/seam/connect/parse-options.ts

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,54 @@
1-
import { isSeamHttpOptionsWithClient, type SeamHttpOptions } from './options.js'
1+
import { getAuthHeaders } from './auth.js'
2+
import type { ClientOptions } from './client.js'
3+
import {
4+
isSeamHttpOptionsWithClient,
5+
isSeamHttpOptionsWithClientSessionToken,
6+
type SeamHttpOptions,
7+
} from './options.js'
28

39
const defaultEndpoint = 'https://connect.getseam.com'
410

11+
export type Options = SeamHttpOptions & { publishableKey?: string }
12+
513
export const parseOptions = (
6-
apiKeyOrOptions: string | SeamHttpOptions,
7-
): Required<SeamHttpOptions> => {
14+
apiKeyOrOptions: string | Options,
15+
): ClientOptions => {
16+
const options = getNormalizedOptions(apiKeyOrOptions)
17+
18+
if (isSeamHttpOptionsWithClient(options)) return options
19+
20+
return {
21+
axiosOptions: {
22+
baseURL: options.endpoint ?? getEndpointFromEnv() ?? defaultEndpoint,
23+
withCredentials: isSeamHttpOptionsWithClientSessionToken(options),
24+
...options.axiosOptions,
25+
headers: {
26+
...getAuthHeaders(options),
27+
...options.axiosOptions?.headers,
28+
},
29+
},
30+
axiosRetryOptions: {
31+
...options.axiosRetryOptions,
32+
},
33+
}
34+
}
35+
36+
const getNormalizedOptions = (
37+
apiKeyOrOptions: string | Options,
38+
): SeamHttpOptions => {
839
const options =
940
typeof apiKeyOrOptions === 'string'
1041
? { apiKey: apiKeyOrOptions }
1142
: apiKeyOrOptions
1243

1344
if (isSeamHttpOptionsWithClient(options)) return options
1445

15-
const endpoint = options.endpoint ?? getEndpointFromEnv() ?? defaultEndpoint
16-
1746
const apiKey =
1847
'apiKey' in options ? options.apiKey : getApiKeyFromEnv(options)
1948

2049
return {
2150
...options,
2251
...(apiKey != null ? { apiKey } : {}),
23-
endpoint,
24-
axiosOptions: options.axiosOptions ?? {},
25-
axiosRetryOptions: options.axiosRetryOptions ?? {},
2652
}
2753
}
2854

src/lib/seam/connect/routes/access-codes-unmanaged.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,37 @@ import {
2222
type SeamHttpOptionsWithClientSessionToken,
2323
} from 'lib/seam/connect/options.js'
2424
import { parseOptions } from 'lib/seam/connect/parse-options.js'
25-
import { SeamHttpClientSessions } from 'lib/seam/connect/routes/client-sessions.js'
25+
26+
import { SeamHttpClientSessions } from './client-sessions.js'
2627

2728
export class SeamHttpAccessCodesUnmanaged {
2829
client: Client
2930

3031
constructor(apiKeyOrOptions: string | SeamHttpOptions = {}) {
31-
const options = parseOptions(apiKeyOrOptions)
32-
this.client = createClient(options)
32+
const clientOptions = parseOptions(apiKeyOrOptions)
33+
this.client = createClient(clientOptions)
3334
}
3435

3536
static fromClient(
3637
client: SeamHttpOptionsWithClient['client'],
3738
options: Omit<SeamHttpOptionsWithClient, 'client'> = {},
3839
): SeamHttpAccessCodesUnmanaged {
39-
const opts = { ...options, client }
40-
if (!isSeamHttpOptionsWithClient(opts)) {
40+
const constructorOptions = { ...options, client }
41+
if (!isSeamHttpOptionsWithClient(constructorOptions)) {
4142
throw new SeamHttpInvalidOptionsError('Missing client')
4243
}
43-
return new SeamHttpAccessCodesUnmanaged(opts)
44+
return new SeamHttpAccessCodesUnmanaged(constructorOptions)
4445
}
4546

4647
static fromApiKey(
4748
apiKey: SeamHttpOptionsWithApiKey['apiKey'],
4849
options: Omit<SeamHttpOptionsWithApiKey, 'apiKey'> = {},
4950
): SeamHttpAccessCodesUnmanaged {
50-
const opts = { ...options, apiKey }
51-
if (!isSeamHttpOptionsWithApiKey(opts)) {
51+
const constructorOptions = { ...options, apiKey }
52+
if (!isSeamHttpOptionsWithApiKey(constructorOptions)) {
5253
throw new SeamHttpInvalidOptionsError('Missing apiKey')
5354
}
54-
return new SeamHttpAccessCodesUnmanaged(opts)
55+
return new SeamHttpAccessCodesUnmanaged(constructorOptions)
5556
}
5657

5758
static fromClientSessionToken(
@@ -61,20 +62,20 @@ export class SeamHttpAccessCodesUnmanaged {
6162
'clientSessionToken'
6263
> = {},
6364
): SeamHttpAccessCodesUnmanaged {
64-
const opts = { ...options, clientSessionToken }
65-
if (!isSeamHttpOptionsWithClientSessionToken(opts)) {
65+
const constructorOptions = { ...options, clientSessionToken }
66+
if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) {
6667
throw new SeamHttpInvalidOptionsError('Missing clientSessionToken')
6768
}
68-
return new SeamHttpAccessCodesUnmanaged(opts)
69+
return new SeamHttpAccessCodesUnmanaged(constructorOptions)
6970
}
7071

7172
static async fromPublishableKey(
7273
publishableKey: string,
7374
userIdentifierKey: string,
7475
options: ClientOptions = {},
7576
): Promise<SeamHttpAccessCodesUnmanaged> {
76-
const opts = parseOptions(options)
77-
const client = createClient({ ...opts, publishableKey })
77+
const clientOptions = parseOptions({ ...options, publishableKey })
78+
const client = createClient(clientOptions)
7879
const clientSessions = SeamHttpClientSessions.fromClient(client)
7980
// TODO: clientSessions.getOrCreate({ user_identifier_key: userIdentifierKey })
8081
const { token } = await clientSessions.create({

src/lib/seam/connect/routes/access-codes.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,38 @@ import {
2222
type SeamHttpOptionsWithClientSessionToken,
2323
} from 'lib/seam/connect/options.js'
2424
import { parseOptions } from 'lib/seam/connect/parse-options.js'
25-
import { SeamHttpClientSessions } from 'lib/seam/connect/routes/client-sessions.js'
2625

2726
import { SeamHttpAccessCodesUnmanaged } from './access-codes-unmanaged.js'
27+
import { SeamHttpClientSessions } from './client-sessions.js'
2828

2929
export class SeamHttpAccessCodes {
3030
client: Client
3131

3232
constructor(apiKeyOrOptions: string | SeamHttpOptions = {}) {
33-
const options = parseOptions(apiKeyOrOptions)
34-
this.client = createClient(options)
33+
const clientOptions = parseOptions(apiKeyOrOptions)
34+
this.client = createClient(clientOptions)
3535
}
3636

3737
static fromClient(
3838
client: SeamHttpOptionsWithClient['client'],
3939
options: Omit<SeamHttpOptionsWithClient, 'client'> = {},
4040
): SeamHttpAccessCodes {
41-
const opts = { ...options, client }
42-
if (!isSeamHttpOptionsWithClient(opts)) {
41+
const constructorOptions = { ...options, client }
42+
if (!isSeamHttpOptionsWithClient(constructorOptions)) {
4343
throw new SeamHttpInvalidOptionsError('Missing client')
4444
}
45-
return new SeamHttpAccessCodes(opts)
45+
return new SeamHttpAccessCodes(constructorOptions)
4646
}
4747

4848
static fromApiKey(
4949
apiKey: SeamHttpOptionsWithApiKey['apiKey'],
5050
options: Omit<SeamHttpOptionsWithApiKey, 'apiKey'> = {},
5151
): SeamHttpAccessCodes {
52-
const opts = { ...options, apiKey }
53-
if (!isSeamHttpOptionsWithApiKey(opts)) {
52+
const constructorOptions = { ...options, apiKey }
53+
if (!isSeamHttpOptionsWithApiKey(constructorOptions)) {
5454
throw new SeamHttpInvalidOptionsError('Missing apiKey')
5555
}
56-
return new SeamHttpAccessCodes(opts)
56+
return new SeamHttpAccessCodes(constructorOptions)
5757
}
5858

5959
static fromClientSessionToken(
@@ -63,20 +63,20 @@ export class SeamHttpAccessCodes {
6363
'clientSessionToken'
6464
> = {},
6565
): SeamHttpAccessCodes {
66-
const opts = { ...options, clientSessionToken }
67-
if (!isSeamHttpOptionsWithClientSessionToken(opts)) {
66+
const constructorOptions = { ...options, clientSessionToken }
67+
if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) {
6868
throw new SeamHttpInvalidOptionsError('Missing clientSessionToken')
6969
}
70-
return new SeamHttpAccessCodes(opts)
70+
return new SeamHttpAccessCodes(constructorOptions)
7171
}
7272

7373
static async fromPublishableKey(
7474
publishableKey: string,
7575
userIdentifierKey: string,
7676
options: ClientOptions = {},
7777
): Promise<SeamHttpAccessCodes> {
78-
const opts = parseOptions(options)
79-
const client = createClient({ ...opts, publishableKey })
78+
const clientOptions = parseOptions({ ...options, publishableKey })
79+
const client = createClient(clientOptions)
8080
const clientSessions = SeamHttpClientSessions.fromClient(client)
8181
// TODO: clientSessions.getOrCreate({ user_identifier_key: userIdentifierKey })
8282
const { token } = await clientSessions.create({

src/lib/seam/connect/routes/acs-access-groups.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,37 @@ import {
2222
type SeamHttpOptionsWithClientSessionToken,
2323
} from 'lib/seam/connect/options.js'
2424
import { parseOptions } from 'lib/seam/connect/parse-options.js'
25-
import { SeamHttpClientSessions } from 'lib/seam/connect/routes/client-sessions.js'
25+
26+
import { SeamHttpClientSessions } from './client-sessions.js'
2627

2728
export class SeamHttpAcsAccessGroups {
2829
client: Client
2930

3031
constructor(apiKeyOrOptions: string | SeamHttpOptions = {}) {
31-
const options = parseOptions(apiKeyOrOptions)
32-
this.client = createClient(options)
32+
const clientOptions = parseOptions(apiKeyOrOptions)
33+
this.client = createClient(clientOptions)
3334
}
3435

3536
static fromClient(
3637
client: SeamHttpOptionsWithClient['client'],
3738
options: Omit<SeamHttpOptionsWithClient, 'client'> = {},
3839
): SeamHttpAcsAccessGroups {
39-
const opts = { ...options, client }
40-
if (!isSeamHttpOptionsWithClient(opts)) {
40+
const constructorOptions = { ...options, client }
41+
if (!isSeamHttpOptionsWithClient(constructorOptions)) {
4142
throw new SeamHttpInvalidOptionsError('Missing client')
4243
}
43-
return new SeamHttpAcsAccessGroups(opts)
44+
return new SeamHttpAcsAccessGroups(constructorOptions)
4445
}
4546

4647
static fromApiKey(
4748
apiKey: SeamHttpOptionsWithApiKey['apiKey'],
4849
options: Omit<SeamHttpOptionsWithApiKey, 'apiKey'> = {},
4950
): SeamHttpAcsAccessGroups {
50-
const opts = { ...options, apiKey }
51-
if (!isSeamHttpOptionsWithApiKey(opts)) {
51+
const constructorOptions = { ...options, apiKey }
52+
if (!isSeamHttpOptionsWithApiKey(constructorOptions)) {
5253
throw new SeamHttpInvalidOptionsError('Missing apiKey')
5354
}
54-
return new SeamHttpAcsAccessGroups(opts)
55+
return new SeamHttpAcsAccessGroups(constructorOptions)
5556
}
5657

5758
static fromClientSessionToken(
@@ -61,20 +62,20 @@ export class SeamHttpAcsAccessGroups {
6162
'clientSessionToken'
6263
> = {},
6364
): SeamHttpAcsAccessGroups {
64-
const opts = { ...options, clientSessionToken }
65-
if (!isSeamHttpOptionsWithClientSessionToken(opts)) {
65+
const constructorOptions = { ...options, clientSessionToken }
66+
if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) {
6667
throw new SeamHttpInvalidOptionsError('Missing clientSessionToken')
6768
}
68-
return new SeamHttpAcsAccessGroups(opts)
69+
return new SeamHttpAcsAccessGroups(constructorOptions)
6970
}
7071

7172
static async fromPublishableKey(
7273
publishableKey: string,
7374
userIdentifierKey: string,
7475
options: ClientOptions = {},
7576
): Promise<SeamHttpAcsAccessGroups> {
76-
const opts = parseOptions(options)
77-
const client = createClient({ ...opts, publishableKey })
77+
const clientOptions = parseOptions({ ...options, publishableKey })
78+
const client = createClient(clientOptions)
7879
const clientSessions = SeamHttpClientSessions.fromClient(client)
7980
// TODO: clientSessions.getOrCreate({ user_identifier_key: userIdentifierKey })
8081
const { token } = await clientSessions.create({

0 commit comments

Comments
 (0)