(
{ name, ...options }: AsyncIteratorWithSpanOptions,
iterator: AsyncIterator<T, TReturn, TNext>,
)
| 173 | } |
| 174 | |
| 175 | export function asyncIteratorWithSpan<T, TReturn, TNext>( |
| 176 | { name, ...options }: AsyncIteratorWithSpanOptions, |
| 177 | iterator: AsyncIterator<T, TReturn, TNext>, |
| 178 | ): AsyncIteratorClass<T, TReturn, TNext> { |
| 179 | let span: ReturnType<typeof startSpan> | undefined |
| 180 | |
| 181 | return new AsyncIteratorClass( |
| 182 | async () => { |
| 183 | span ??= startSpan(name) |
| 184 | |
| 185 | try { |
| 186 | const result = await runInSpanContext(span, () => iterator.next()) |
| 187 | span?.addEvent(result.done ? 'completed' : 'yielded') |
| 188 | return result |
| 189 | } |
| 190 | catch (err) { |
| 191 | setSpanError(span, err, options) |
| 192 | throw err |
| 193 | } |
| 194 | }, |
| 195 | async (reason) => { |
| 196 | try { |
| 197 | if (reason !== 'next') { |
| 198 | await runInSpanContext(span, () => iterator.return?.()) |
| 199 | } |
| 200 | } |
| 201 | catch (err) { |
| 202 | setSpanError(span, err, options) |
| 203 | throw err |
| 204 | } |
| 205 | finally { |
| 206 | span?.end() |
| 207 | } |
| 208 | }, |
| 209 | ) |
| 210 | } |
no test coverage detected