Path: blob/master/src/packages/jupyter/kernel/logo.ts
1447 views
/*1Return best(=biggest or svg) logo for the kernel, e.g.,23{filename:"logo-svg.svg", base64:"base-64 version of logo-svg.svg"}.45Throws error if there is no logo for the given kernel.67If we get a logo successfully, we cache it for an hour, unless the noCache option is given.8*/910import { get_kernel_data } from "@cocalc/jupyter/kernel/kernel-data";11import { join } from "path";12import { readdir, readFile } from "fs/promises";13import LRU from "lru-cache";1415interface Logo {16filename: string;17base64: string;18}1920const cache = new LRU<string, Logo>({21ttl: 60 * 60 * 1000,22max: 30,23});2425function getKernel(kernelData, name) {26for (const k of kernelData) {27if (k.name == name) {28return k;29}30}31return null;32}3334export async function logo(35kernelName: string,36{ noCache }: { noCache?: boolean } = {},37): Promise<Logo> {38if (!noCache && cache.has(kernelName)) {39return cache.get(kernelName)!;40}41const kernelData = await get_kernel_data({ noCache });4243const kernel = getKernel(kernelData, kernelName);44if (kernel == null) {45const msg = `no such kernel '${kernelName}'`;46throw Error(msg);47}48const resource_dir = kernel.resource_dir;49// get the files from resource_dir, which may include:50// logo-32x32.png logo-64x64.png logo-svg.svg51// and sort in reverse alphabetical order and select first.52// This gets 64x64 above 32x32 and 128x128 above 64x64, but53// svg very first, since it's the best.5455// get the files from resource_dir56const files = (await readdir(resource_dir)).filter((name) =>57name.startsWith("logo-"),58);5960// sort in reverse alphabetical order61files.sort((a, b) => b.localeCompare(a));6263// select the first file, if any64const selectedFile = files[0];6566let base64;67if (selectedFile) {68// Read the file and encode it in base6469const filePath = join(resource_dir, selectedFile);70const fileBuffer = await readFile(filePath);71base64 = fileBuffer.toString("base64");72} else {73base64 = "";74}7576const x = { filename: selectedFile, base64 };77cache.set(kernelName, x);78return x;79}808182