* fix: roadmap refetching * fix: remove current roadmap * feat: explore ai roadmaps * feat: generate roadmap content * fix: roadmap topic details * fix: make roadmap link * feat: add visit cookie * chore: update naming * Update UI for roadmap search * Update * Update * UI updates * fix: expire visit cookie in 1 hour * chore: limit roadmap topic content generation * Add alert on generate roadmap * UI for search * Refactor nodesg * Refactor * Load roadmap on click * Refactor UI for ai * Allow overriding with own API key * Allow overriding keys * Add configuration for open ai key * Add open ai saving * Fix responsiveness issues * Fix responsiveness issues --------- Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
74 lines
1.6 KiB
TypeScript
74 lines
1.6 KiB
TypeScript
const NEW_LINE = '\n'.charCodeAt(0);
|
|
|
|
export async function readAIRoadmapStream(
|
|
reader: ReadableStreamDefaultReader<Uint8Array>,
|
|
{
|
|
onStream,
|
|
onStreamEnd,
|
|
}: {
|
|
onStream?: (roadmap: string) => void;
|
|
onStreamEnd?: (roadmap: string) => void;
|
|
},
|
|
) {
|
|
const decoder = new TextDecoder('utf-8');
|
|
let result = '';
|
|
|
|
while (true) {
|
|
const { value, done } = await reader.read();
|
|
if (done) {
|
|
break;
|
|
}
|
|
|
|
// We will call the renderRoadmap callback whenever we encounter
|
|
// a new line with the result until the new line
|
|
// otherwise, we will keep appending the result to the previous result
|
|
if (value) {
|
|
let start = 0;
|
|
for (let i = 0; i < value.length; i++) {
|
|
if (value[i] === NEW_LINE) {
|
|
result += decoder.decode(value.slice(start, i + 1));
|
|
onStream?.(result);
|
|
start = i + 1;
|
|
}
|
|
}
|
|
if (start < value.length) {
|
|
result += decoder.decode(value.slice(start));
|
|
}
|
|
}
|
|
}
|
|
|
|
onStream?.(result);
|
|
onStreamEnd?.(result);
|
|
reader.releaseLock();
|
|
}
|
|
|
|
export async function readAIRoadmapContentStream(
|
|
reader: ReadableStreamDefaultReader<Uint8Array>,
|
|
{
|
|
onStream,
|
|
onStreamEnd,
|
|
}: {
|
|
onStream?: (roadmap: string) => void;
|
|
onStreamEnd?: (roadmap: string) => void;
|
|
},
|
|
) {
|
|
const decoder = new TextDecoder('utf-8');
|
|
let result = '';
|
|
|
|
while (true) {
|
|
const { value, done } = await reader.read();
|
|
if (done) {
|
|
break;
|
|
}
|
|
|
|
if (value) {
|
|
result += decoder.decode(value);
|
|
onStream?.(result);
|
|
}
|
|
}
|
|
|
|
onStream?.(result);
|
|
onStreamEnd?.(result);
|
|
reader.releaseLock();
|
|
}
|