UNPKG

@datastax/astra-db-ts

Version:
60 lines (59 loc) 2.19 kB
// 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;