char-slop/berry
multipurpose self-modifiable agentic harness
git clone https://git.t4t.associates/char-slop/berry
ca9626a
main
1import { assertEquals , assertRejects } from "@std/assert" ; 2 3Deno . test ( "streams can be iterated without native async-iterator support" , async ( t ) => { 4const native = Object . getOwnPropertyDescriptor ( ReadableStream . prototype , Symbol . asyncIterator ) ! ; 5Reflect . deleteProperty ( ReadableStream . prototype , Symbol . asyncIterator ); 6try { 7await import ( "./stream-iterator.ts" ); 8 9await t . step ( "completion releases the reader without canceling" , async () => { 10let canceled = false ; 11const stream = new ReadableStream ({ 12start ( controller ) { 13controller . enqueue ( "shell output" ); 14controller . close (); 15}, 16cancel :() => void ( canceled = true ), 17}); 18const received = []; 19for await ( const chunk of stream ) received . push ( chunk ); 20assertEquals ( received , [ "shell output" ]); 21assertEquals ( stream . locked , false ); 22assertEquals ( canceled , false ); 23}); 24 25await t . step ( "early exit cancels and releases the reader" , async () => { 26let canceled = false ; 27const stream = new ReadableStream ({ 28start :( controller ) => controller . enqueue ( "shell output" ), 29cancel :() => void ( canceled = true ), 30}); 31for await ( const _ of stream ) break ; 32assertEquals ( canceled , true ); 33assertEquals ( stream . locked , false ); 34}); 35 36await t . step ( "preventCancel leaves the stream available after early exit" , async () => { 37let canceled = false ; 38const stream = new ReadableStream ({ 39start ( controller ) { 40controller . enqueue ( "first" ); 41controller . enqueue ( "second" ); 42}, 43cancel :() => void ( canceled = true ), 44}); 45for await ( const _ of stream [ Symbol . asyncIterator ]({ preventCancel :true })) break ; 46assertEquals ( canceled , false ); 47assertEquals ( stream . locked , false ); 48const reader = stream . getReader (); 49assertEquals (( await reader . read ()). value , "second" ); 50await reader . cancel (); 51reader . releaseLock (); 52}); 53 54await t . step ( "read errors propagate and release the reader" , async () => { 55const stream = new ReadableStream ({ 56start :( controller ) => controller . error ( new Error ( "connection lost" )), 57}); 58await assertRejects (() => stream [ Symbol . asyncIterator ](). next (), Error , "connection lost" ); 59assertEquals ( stream . locked , false ); 60}); 61} finally { 62Object . defineProperty ( ReadableStream . prototype , Symbol . asyncIterator , native ); 63} 64});