/** A typed uplink whose return interrupts a pending read, matching Gateway invocation cleanup. */ export function inputChannel() { let controller!: ReadableStreamDefaultController const stream = new ReadableStream({ start(value) { controller = value } }) const reader = stream.getReader() const source: AsyncIterable = { [Symbol.asyncIterator]: () => ({ async next() { const result = await reader.read() return result.done ? { done: true, value: undefined } : { done: false, value: result.value } }, async return() { await reader.cancel(); return { done: true, value: undefined } }, }), } return { source, push: (value: T) => { controller.enqueue(value) }, end: () => { controller.close() } } }