export function prettyObject(msg: any) { const obj = msg; if (typeof msg !== 'string') { msg = JSON.stringify(msg, null, ' '); } if (msg === '{}') { return obj.toString(); } if (msg.startsWith('```json')) { return msg; } return ['```json', msg, '```'].join('\n'); } export function* chunks(s: string, maxBytes = 1000 * 1000) { const decoder = new TextDecoder('utf-8'); let buf = new TextEncoder().encode(s); while (buf.length) { let i = buf.lastIndexOf(32, maxBytes + 1); // If no space found, try forward search if (i < 0) { i = buf.indexOf(32, maxBytes); } // If there's no space at all, take all if (i < 0) { i = buf.length; } // This is a safe cut-off point; never half-way a multi-byte yield decoder.decode(buf.slice(0, i)); buf = buf.slice(i + 1); // Skip space (if any) } }