Files
developer-roadmap/src/helper/read-stream.ts
T
Arik ChakmaandKamran Ahmed cd6232035f Refactor AI roadmap generator (#5300)
* 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>
2024-03-11 05:14:32 +00:00

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();
}