Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/jupyter/kernel/logo.ts
1447 views
1
/*
2
Return best(=biggest or svg) logo for the kernel, e.g.,
3
4
{filename:"logo-svg.svg", base64:"base-64 version of logo-svg.svg"}.
5
6
Throws error if there is no logo for the given kernel.
7
8
If we get a logo successfully, we cache it for an hour, unless the noCache option is given.
9
*/
10
11
import { get_kernel_data } from "@cocalc/jupyter/kernel/kernel-data";
12
import { join } from "path";
13
import { readdir, readFile } from "fs/promises";
14
import LRU from "lru-cache";
15
16
interface Logo {
17
filename: string;
18
base64: string;
19
}
20
21
const cache = new LRU<string, Logo>({
22
ttl: 60 * 60 * 1000,
23
max: 30,
24
});
25
26
function getKernel(kernelData, name) {
27
for (const k of kernelData) {
28
if (k.name == name) {
29
return k;
30
}
31
}
32
return null;
33
}
34
35
export async function logo(
36
kernelName: string,
37
{ noCache }: { noCache?: boolean } = {},
38
): Promise<Logo> {
39
if (!noCache && cache.has(kernelName)) {
40
return cache.get(kernelName)!;
41
}
42
const kernelData = await get_kernel_data({ noCache });
43
44
const kernel = getKernel(kernelData, kernelName);
45
if (kernel == null) {
46
const msg = `no such kernel '${kernelName}'`;
47
throw Error(msg);
48
}
49
const resource_dir = kernel.resource_dir;
50
// get the files from resource_dir, which may include:
51
// logo-32x32.png logo-64x64.png logo-svg.svg
52
// and sort in reverse alphabetical order and select first.
53
// This gets 64x64 above 32x32 and 128x128 above 64x64, but
54
// svg very first, since it's the best.
55
56
// get the files from resource_dir
57
const files = (await readdir(resource_dir)).filter((name) =>
58
name.startsWith("logo-"),
59
);
60
61
// sort in reverse alphabetical order
62
files.sort((a, b) => b.localeCompare(a));
63
64
// select the first file, if any
65
const selectedFile = files[0];
66
67
let base64;
68
if (selectedFile) {
69
// Read the file and encode it in base64
70
const filePath = join(resource_dir, selectedFile);
71
const fileBuffer = await readFile(filePath);
72
base64 = fileBuffer.toString("base64");
73
} else {
74
base64 = "";
75
}
76
77
const x = { filename: selectedFile, base64 };
78
cache.set(kernelName, x);
79
return x;
80
}
81
82