@datastax/astra-db-ts
Version:
Data API TypeScript client
60 lines (59 loc) • 2.19 kB
JavaScript
// Copyright Datastax, Inc
// SPDX-License-Identifier: Apache-2.0
import { HeadersProvider, StaticTokenProvider } from '../../lib/index.js';
import { anyInstanceOf, findLast, isNullish } from '../../lib/utils.js';
import { MonoidalOptionsHandler } from '../../lib/opts-handlers.js';
import { either, nullish, string } from 'decoders';
import { DEFAULT_DATA_API_AUTH_HEADER, DEFAULT_DEVOPS_API_AUTH_HEADER } from '../../lib/api/constants.js';
export class TokenProvider {
toHeadersProvider() {
// eslint-disable-next-line @typescript-eslint/no-this-alias -- necessary in this case
const tp = this;
const hp = new (class extends HeadersProvider {
getHeaders(ctx) {
const maybePromise = tp.getToken();
return (maybePromise instanceof Promise)
? maybePromise.then(tp._mkAuthHeader(ctx))
: tp._mkAuthHeader(ctx)(maybePromise);
}
})();
return HeadersProvider.opts.fromObj.parse(hp);
}
_mkAuthHeader(ctx) {
return (token) => (token)
? (ctx.for === 'data-api')
? { [DEFAULT_DATA_API_AUTH_HEADER]: token }
: { [DEFAULT_DEVOPS_API_AUTH_HEADER]: `Bearer ${token}` }
: {};
}
}
class UnsetTokenProvider extends TokenProvider {
constructor() {
super();
}
getToken() {
return undefined;
}
}
Object.defineProperty(UnsetTokenProvider, "INSTANCE", {
enumerable: true,
configurable: true,
writable: true,
value: new UnsetTokenProvider()
});
const monoid = {
empty: UnsetTokenProvider.INSTANCE,
concat: findLast((a) => a !== UnsetTokenProvider.INSTANCE, UnsetTokenProvider.INSTANCE),
};
const decoder = nullish(either(anyInstanceOf(TokenProvider), string));
const transformed = decoder.transform((input) => {
if (typeof input === 'string') {
return new StaticTokenProvider(input);
}
if (isNullish(input)) {
return UnsetTokenProvider.INSTANCE;
}
return input;
});
const TokenProviderOptsHandler = new MonoidalOptionsHandler(transformed, monoid);
TokenProvider.opts = TokenProviderOptsHandler;