sanity-plugin-mux-input
Version:
An input component that integrates Sanity Studio with Mux video encoding/hosting service.
49 lines (42 loc) • 1.36 kB
text/typescript
import type {SanityClient} from 'sanity'
import {suspend} from 'suspend-react'
import {readSecrets} from './readSecrets'
import type {AnimatedThumbnailOptions, ThumbnailOptions} from './types'
export type Audience = 'g' | 's' | 't' | 'v'
export type Payload<T extends Audience> = T extends 'g'
? AnimatedThumbnailOptions
: T extends 's'
? never
: T extends 't'
? ThumbnailOptions
: T extends 'v'
? never
: never
export function generateJwt<T extends Audience>(
client: SanityClient,
playbackId: string,
aud: T,
payload?: Payload<T>
): string {
const {signingKeyId, signingKeyPrivate} = readSecrets(client)
if (!signingKeyId) {
throw new TypeError("Missing `signingKeyId`.\n Check your plugin's configuration")
}
if (!signingKeyPrivate) {
throw new TypeError("Missing `signingKeyPrivate`.\n Check your plugin's configuration")
}
// @ts-expect-error - handle missing typings for this package
const {default: sign} = suspend(() => import('jsonwebtoken-esm/sign'), ['jsonwebtoken-esm/sign'])
return sign(
payload ? JSON.parse(JSON.stringify(payload, (_, v) => v ?? undefined)) : {},
atob(signingKeyPrivate),
{
algorithm: 'RS256',
keyid: signingKeyId,
audience: aud,
subject: playbackId,
noTimestamp: true,
expiresIn: '12h',
}
)
}