-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
53 lines (41 loc) 路 1.23 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import type { Abortable, Headers, Payload } from 'piecemeal';
/*#__INLINE__*/
function message(payload: any, headers: Headers) {
const returns = [''];
for (let key in headers) returns.push(`${key}: ${headers[key]}`);
returns.push('', String(payload), '');
return returns.join('\r\n');
}
/*#__INLINE__*/
function is_raw(data: any): data is Payload<any> {
return 'headers' in data && 'data' in data;
}
export async function generate<T extends any>(
iterator: AsyncIterableIterator<T> | IterableIterator<T>,
boundary: string,
write: (chunk: string) => Promise<any> | any,
abort?: Abortable,
) {
await write(`--${boundary}`);
for await (let data of iterator) {
if (abort && abort.aborted) break;
let payload: any = data,
headers;
let dtype = typeof data;
if (data === null) payload = '';
else if (dtype === 'object') {
if (is_raw(data)) {
headers = data.headers;
payload = data.data;
} else {
headers = { 'content-type': 'application/json;charset=utf-8' };
payload = JSON.stringify(data);
}
} else if (dtype !== 'string') {
payload = String(data);
}
headers = headers || { 'content-type': 'text/plain' };
await write(message(payload, headers) + `--${boundary}`);
}
await write(`--\r\n`);
}