@johngw/stream
Version:
Reactive programming tools using the WHATWG Streams API.
57 lines (53 loc) • 1.34 kB
text/typescript
/**
* Creates a ReadableStream from DOM mutations.
*
* @group Sources
* @see {@link addedNodes:function}
* @see {@link removedNodes:function}
* @example
* ```
* fromDOMMutations(document.body, { childList: true })
* .pipeTo(write((mutation) => {
* console.info(mutation.addedNodes)
* }))
* ```
*
* If the queue is full when receiving DOM mutations, you
* may notice some events being dropped. To avoid this you
* will need to increase the high water mark.
*
* ```
* fromDOMMutations(
* document.body,
* { childList: true },
* new CountQueuingStrategy({ highWaterMark: 10 })
* )
* .pipeThrough(addedNodes())
* .pipeTo(
* write(console.info),
* new CountQueuingStrategy({ highWaterMark: 50 })
* )
* ```
*/
export function fromDOMMutations(
target: Node,
options?: MutationObserverInit,
queuingStrategy?: QueuingStrategy<MutationRecord>
) {
let observer: MutationObserver
return new ReadableStream<MutationRecord>(
{
start(controller) {
observer = new MutationObserver((mutations) => {
for (const mutation of mutations)
if (controller.desiredSize) controller.enqueue(mutation)
})
observer.observe(target, options)
},
cancel() {
observer.disconnect()
},
},
queuingStrategy
)
}