sflow
Version:
sflow is a powerful and highly-extensible library designed for processing and manipulating streams of data effortlessly. Inspired by the functional programming paradigm, it provides a rich set of utilities for transforming streams, including chunking, fil
1,709 lines (1,628 loc) • 148 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sflow = {}));
})(this, (function (exports) { 'use strict';
var __create = Object.create;
var __getProtoOf = Object.getPrototypeOf;
var __defProp = Object.defineProperty;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __toESM = (mod, isNodeMode, target) => {
target = mod != null ? __create(__getProtoOf(mod)) : {};
const to = __defProp(target, "default", { value: mod, enumerable: true }) ;
for (let key of __getOwnPropNames(mod))
if (!__hasOwnProp.call(to, key))
__defProp(to, key, {
get: () => mod[key],
enumerable: true
});
return to;
};
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {
get: all[name],
enumerable: true,
configurable: true,
set: (newValue) => all[name] = () => newValue
});
};
// node_modules/unwind-array/src/index.js
var require_src = __commonJS((exports, module) => {
var unwind = (dataObject, options) => {
const unwindRecursive = (dataObject2, path, currPath) => {
const pathArr = path.split(".");
if (!currPath) {
currPath = pathArr[0];
}
const result = [];
let added = false;
const addObject = (objectTempUnwind, objectKey) => {
Object.keys(objectTempUnwind).forEach((objectTempUnwindKey) => {
const newObjectCopy = {};
Object.keys(dataObject2).forEach((dataObjectKey) => {
newObjectCopy[dataObjectKey] = dataObject2[dataObjectKey];
});
newObjectCopy[objectKey] = objectTempUnwind[objectTempUnwindKey];
added = true;
result.push(newObjectCopy);
});
};
Object.keys(dataObject2).forEach((objectKey) => {
if (currPath === objectKey) {
if (dataObject2[objectKey] instanceof Array) {
if (dataObject2[objectKey].length === 0 && options.preserveEmptyArray !== true) {
delete dataObject2[objectKey];
} else {
Object.keys(dataObject2[objectKey]).forEach((objectElementKey) => {
addObject(unwindRecursive(dataObject2[objectKey][objectElementKey], path.replace(`${currPath}.`, "")), objectKey);
});
}
} else {
addObject(unwindRecursive(dataObject2[objectKey], path.replace(`${currPath}.`, "")), objectKey);
}
}
});
if (!added) {
result.push(dataObject2);
}
return result;
};
return unwindRecursive(dataObject, options.path);
};
module.exports = { unwind };
});
// node_modules/phpdie/dist/index.js
var phpdie_default = DIE;
function DIE(reason, ...slots) {
throw errorFormat(reason, ...slots);
}
function errorFormat(reason, ...slots) {
if (typeof reason === "string") {
return reason.trim();
}
if (Array.isArray(reason)) {
return reason.map((e, i) => e + (slots[i] ?? "")).join("");
}
return reason;
}
// src/andIgnoreError.ts
function andIgnoreError(regex) {
return (error) => error?.message?.match(regex) ? null : phpdie_default(error);
}
// node_modules/polyfill-text-encoder-stream/dist/index.js
class PolyfillTextEncoderStream {
_encoder = new TextEncoder;
_reader = null;
ready = Promise.resolve();
closed = false;
readable = new ReadableStream({
start: (controller) => {
this._reader = controller;
}
});
writable = new WritableStream({
write: async (chunk) => {
if (typeof chunk !== "string") {
this._reader.enqueue(chunk);
return;
}
if (chunk != null && this._reader) {
const encoded = this._encoder.encode(chunk);
this._reader.enqueue(encoded);
}
},
close: () => {
this._reader?.close();
this.closed = true;
},
abort: (reason) => {
this._reader?.error(reason);
this.closed = true;
}
});
}
// src/asyncMaps.ts
var asyncMaps = (fn, options = {}) => {
let i = 0;
let tasks = new Map;
return new TransformStream({
transform: async (chunk, ctrl) => {
const id = i++;
tasks.set(id, async function() {
return fn(chunk, id);
}().then((data) => ({ id, data })));
if (tasks.size >= (options.concurrency ?? Infinity)) {
const { id: id2, data } = await Promise.race(tasks.values());
tasks.delete(id2);
ctrl.enqueue(data);
}
},
flush: async (ctrl) => {
while (tasks.size) {
const { id, data } = await Promise.race(tasks.values());
tasks.delete(id);
ctrl.enqueue(data);
}
}
});
};
// src/never.ts
var never = () => new Promise(() => null);
// src/cacheLists.ts
function cacheLists(store, _options) {
const { key = new Error().stack ?? phpdie_default("missing cache key") } = typeof _options === "string" ? { key: _options } : _options ?? {};
const chunks = [];
const cacheHitPromise = store.has?.(key) || store.get(key);
let hitflag = false;
return new TransformStream({
start: async (ctrl) => {
if (!await cacheHitPromise)
return;
const cached = await store.get(key);
if (!cached)
return;
cached.map((c) => ctrl.enqueue(c));
hitflag = true;
},
transform: async (chunk, ctrl) => {
if (await cacheHitPromise || hitflag) {
ctrl.terminate();
return never();
}
chunks.push(chunk);
ctrl.enqueue(chunk);
},
flush: async () => await store.set(key, chunks)
});
}
// src/cacheSkips.ts
function cacheSkips(store, _options) {
const {
key = new Error().stack ?? phpdie_default("missing cache key"),
windowSize = 1
} = typeof _options === "string" ? { key: _options } : _options ?? {};
const chunks = [];
const cachePromise = store.get(key);
return new TransformStream({
transform: async (chunk, ctrl) => {
const cache = await cachePromise;
const chunked = JSON.stringify(chunk);
const inf404 = (idx) => idx == null || idx < 0 ? Infinity : idx;
const hitCache = (item) => JSON.stringify(item) === chunked;
const cachedContents = cache?.slice(inf404(cache.findIndex(hitCache)));
if (cachedContents?.length) {
await store.set(key, [...chunks, ...cachedContents].slice(0, windowSize));
ctrl.terminate();
return await never();
}
chunks.push(chunk);
ctrl.enqueue(chunk);
},
flush: async () => {
await store.set(key, chunks.slice(0, windowSize));
}
});
}
// node_modules/rambda/src/_internals/cloneList.js
var cloneList = (list) => Array.prototype.slice.call(list);
// node_modules/rambda/src/_internals/isArray.js
var { isArray } = Array;
// node_modules/rambda/src/type.js
function type(input) {
if (input === null) {
return "Null";
} else if (input === undefined) {
return "Undefined";
} else if (Number.isNaN(input)) {
return "NaN";
}
const typeResult = Object.prototype.toString.call(input).slice(8, -1);
return typeResult === "AsyncFunction" ? "Promise" : typeResult;
}
// node_modules/rambda/src/equals.js
function _indexOf(valueToFind, list) {
if (!isArray(list))
throw new Error(`Cannot read property 'indexOf' of ${list}`);
const typeOfValue = type(valueToFind);
if (!["Array", "NaN", "Object", "RegExp"].includes(typeOfValue))
return list.indexOf(valueToFind);
let index = -1;
let foundIndex = -1;
const { length } = list;
while (++index < length && foundIndex === -1)
if (equals(list[index], valueToFind))
foundIndex = index;
return foundIndex;
}
function _arrayFromIterator(iter) {
const list = [];
let next;
while (!(next = iter.next()).done)
list.push(next.value);
return list;
}
function _compareSets(a, b) {
if (a.size !== b.size)
return false;
const aList = _arrayFromIterator(a.values());
const bList = _arrayFromIterator(b.values());
const filtered = aList.filter((aInstance) => _indexOf(aInstance, bList) === -1);
return filtered.length === 0;
}
function compareErrors(a, b) {
if (a.message !== b.message)
return false;
if (a.toString !== b.toString)
return false;
return a.toString() === b.toString();
}
function parseDate(maybeDate) {
if (!maybeDate.toDateString)
return [false];
return [true, maybeDate.getTime()];
}
function parseRegex(maybeRegex) {
if (maybeRegex.constructor !== RegExp)
return [false];
return [true, maybeRegex.toString()];
}
function equals(a, b) {
if (arguments.length === 1)
return (_b) => equals(a, _b);
if (Object.is(a, b))
return true;
const aType = type(a);
if (aType !== type(b))
return false;
if (aType === "Function")
return a.name === undefined ? false : a.name === b.name;
if (["NaN", "Null", "Undefined"].includes(aType))
return true;
if (["BigInt", "Number"].includes(aType)) {
if (Object.is(-0, a) !== Object.is(-0, b))
return false;
return a.toString() === b.toString();
}
if (["Boolean", "String"].includes(aType))
return a.toString() === b.toString();
if (aType === "Array") {
const aClone = Array.from(a);
const bClone = Array.from(b);
if (aClone.toString() !== bClone.toString())
return false;
let loopArrayFlag = true;
aClone.forEach((aCloneInstance, aCloneIndex) => {
if (loopArrayFlag) {
if (aCloneInstance !== bClone[aCloneIndex] && !equals(aCloneInstance, bClone[aCloneIndex]))
loopArrayFlag = false;
}
});
return loopArrayFlag;
}
const aRegex = parseRegex(a);
const bRegex = parseRegex(b);
if (aRegex[0])
return bRegex[0] ? aRegex[1] === bRegex[1] : false;
else if (bRegex[0])
return false;
const aDate = parseDate(a);
const bDate = parseDate(b);
if (aDate[0])
return bDate[0] ? aDate[1] === bDate[1] : false;
else if (bDate[0])
return false;
if (a instanceof Error) {
if (!(b instanceof Error))
return false;
return compareErrors(a, b);
}
if (aType === "Set")
return _compareSets(a, b);
if (aType === "Object") {
const aKeys = Object.keys(a);
if (aKeys.length !== Object.keys(b).length)
return false;
let loopObjectFlag = true;
aKeys.forEach((aKeyInstance) => {
if (loopObjectFlag) {
const aValue = a[aKeyInstance];
const bValue = b[aKeyInstance];
if (aValue !== bValue && !equals(aValue, bValue))
loopObjectFlag = false;
}
});
return loopObjectFlag;
}
return false;
}
// node_modules/rambda/src/sortBy.js
function sortBy(sortFn, list) {
if (arguments.length === 1)
return (_list) => sortBy(sortFn, _list);
const clone = cloneList(list);
return clone.sort((a, b) => {
const aSortResult = sortFn(a);
const bSortResult = sortFn(b);
if (aSortResult === bSortResult)
return 0;
return aSortResult < bSortResult ? -1 : 1;
});
}
// src/cacheTails.ts
function cacheTails(store, _options) {
const { key = new Error().stack ?? phpdie_default("missing cache key") } = typeof _options === "string" ? { key: _options } : _options ?? {};
const chunks = [];
const cachePromise = Promise.withResolvers();
const t = new TransformStream;
const w = t.writable.getWriter();
const writable = new WritableStream({
start: async () => cachePromise.resolve(await store.get(key)),
write: async (chunk, ctrl) => {
const cache = await cachePromise.promise;
if (cache && equals(chunk, cache[0])) {
await store.set(key, [...chunks, ...cache]);
for await (const item of cache)
await w.write(item);
await w.close();
ctrl.error(new Error("cached"));
return await never();
}
chunks.push(chunk);
await w.write(chunk);
},
close: async () => {
await store.set(key, [...chunks]);
await w.close();
},
abort: () => w.abort()
});
return { writable, readable: t.readable };
}
// src/chunkBys.ts
function chunkBys(compareFn) {
let chunks = [];
let lastOrder;
return new TransformStream({
transform: async (chunk, ctrl) => {
const order = await compareFn(chunk);
if (lastOrder && lastOrder !== order)
ctrl.enqueue(chunks.splice(0, Infinity));
chunks.push(chunk);
lastOrder = order;
},
flush: async (ctrl) => void (chunks.length && ctrl.enqueue(chunks))
});
}
// src/chunkIfs.ts
function chunkIfs(predicate, { inclusive = false } = {}) {
let chunks = [];
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const cond = await predicate(chunk, i++, chunks);
if (!inclusive && !cond)
chunks.length && ctrl.enqueue(chunks.splice(0, Infinity));
chunks.push(chunk);
if (!cond)
ctrl.enqueue(chunks.splice(0, Infinity));
},
flush: async (ctrl) => void (chunks.length && ctrl.enqueue(chunks))
});
}
// src/chunkIntervals.ts
function chunkIntervals(interval = 0) {
let chunks = [];
let id = null;
return new TransformStream({
start: (ctrl) => {
id = setInterval(() => ctrl.enqueue(chunks.splice(0, Infinity)), interval);
},
transform: async (chunk) => {
chunks.push(chunk);
},
flush: async (ctrl) => {
if (chunks.length)
ctrl.enqueue(chunks.splice(0, Infinity));
id !== null && clearInterval(id);
}
});
}
// src/chunks.ts
function chunks(n = Infinity) {
let chunks2 = [];
if (n <= 0)
throw new Error("Buffer size must be greater than 0");
return new TransformStream({
transform: async (chunk, ctrl) => {
chunks2.push(chunk);
if (chunks2.length >= n)
ctrl.enqueue(chunks2.splice(0, Infinity));
},
flush: async (ctrl) => void (chunks2.length && ctrl.enqueue(chunks2))
});
}
// node_modules/web-streams-extensions/dist/esm/operators/map.js
function map(select) {
let reader = null;
async function flush(controller) {
try {
while (controller.desiredSize > 0 && reader != null) {
let next = await reader.read();
if (next.done) {
controller.close();
reader = null;
} else {
let mapped = await select(next.value);
if (mapped !== undefined)
controller.enqueue(mapped);
}
}
} catch (err) {
controller.error(err);
}
}
return function(src, opts) {
return new ReadableStream({
start(controller) {
reader = src.getReader();
return flush(controller);
},
pull(controller) {
return flush(controller);
},
cancel(reason) {
if (reader) {
reader.cancel(reason);
reader.releaseLock();
reader = null;
}
}
}, opts);
};
}
// node_modules/web-streams-extensions/dist/esm/_readable-like.js
function isReadableLike(obj) {
return obj["readable"] != null;
}
// node_modules/web-streams-extensions/dist/esm/from.js
function from(src) {
let it;
async function flush(controller) {
try {
while (controller.desiredSize > 0 && it != null) {
let next = await it.next();
if (next.done) {
it = null;
controller.close();
} else {
controller.enqueue(next.value);
}
}
} catch (err) {
controller.error(err);
}
}
if (isReadableLike(src)) {
return src.readable;
}
return new ReadableStream({
async start(controller) {
let iterable;
if (typeof src == "function") {
src = src();
}
if (Symbol.asyncIterator && src[Symbol.asyncIterator])
iterable = src[Symbol.asyncIterator].bind(src);
else if (src[Symbol.iterator])
iterable = src[Symbol.iterator].bind(src);
else {
let value = await Promise.resolve(src);
controller.enqueue(value);
controller.close();
return;
}
it = iterable();
return flush(controller);
},
async pull(controller) {
return flush(controller);
},
async cancel(reason) {
if (reason && it && it.throw) {
it.throw(reason);
} else if (it && it.return) {
await it.return();
}
it = null;
}
});
}
// node_modules/web-streams-extensions/dist/esm/operators/through.js
function through(dst) {
return function(src) {
return src.pipeThrough(dst);
};
}
// node_modules/web-streams-extensions/dist/esm/pipe.js
function pipe(src, ...ops) {
if (isReadableLike(src)) {
src = src.readable;
}
return ops.map((x) => isTransform(x) ? through(x) : x).reduce((p, c) => {
return c(p, { highWaterMark: 1 });
}, src);
}
function isTransform(x) {
return x["readable"] != null && x["writable"] != null;
}
// node_modules/web-streams-extensions/dist/esm/utils/signal.js
class Gate {
_count;
_queue = [];
constructor(_count) {
this._count = _count;
}
async wait() {
if (this._count > 0) {
--this._count;
return Promise.resolve();
}
return new Promise((r) => {
let cb = () => {
this._queue.splice(this._queue.indexOf(cb), 1);
--this._count;
r();
};
this._queue.push(cb);
});
}
increment() {
++this._count;
this.clearQueue();
}
setCount(count) {
this._count = count;
this.clearQueue();
}
clearQueue() {
while (this._count > 0 && this._queue.length > 0) {
this._queue.shift()();
}
}
}
class BlockingQueue {
_pushers = [];
_pullers = [];
constructor() {}
async push(value) {
return new Promise((r) => {
this._pushers.unshift(() => {
r();
return value;
});
this.dequeue();
});
}
async pull() {
return new Promise((r) => {
this._pullers.unshift((value) => {
r(value);
});
this.dequeue();
});
}
dequeue() {
while (this._pullers.length > 0 && this._pushers.length > 0) {
let puller = this._pullers.pop();
let pusher = this._pushers.pop();
puller(pusher());
}
}
}
// node_modules/web-streams-extensions/dist/esm/operators/schedule.js
function schedule(scheduler) {
let reader = null;
async function flush(controller) {
try {
while (controller.desiredSize > 0 && reader != null) {
let next = await reader.read();
if (next.done) {
controller.close();
reader = null;
} else {
await scheduler.nextTick();
controller.enqueue(next.value);
}
}
} catch (err) {
controller.error(err);
}
}
return function(src, opts) {
return new ReadableStream({
start(controller) {
reader = src.getReader();
return flush(controller);
},
pull(controller) {
return flush(controller);
},
cancel(reason) {
if (reader) {
reader.cancel(reason);
reader.releaseLock();
reader = null;
}
}
}, opts);
};
}
// node_modules/web-streams-extensions/dist/esm/operators/on.js
function on(callbacks) {
let reader = null;
async function flush(controller) {
try {
while (controller.desiredSize > 0 && reader != null) {
let next = await reader.read();
if (next.done) {
controller.close();
reader = null;
if (callbacks.complete)
callbacks.complete();
} else {
controller.enqueue(next.value);
}
}
} catch (err) {
controller.error(err);
if (callbacks.error)
callbacks.error(err);
}
}
return function(src, opts) {
return new ReadableStream({
start(controller) {
reader = src.getReader();
if (callbacks.start)
callbacks.start();
return flush(controller);
},
pull(controller) {
return flush(controller);
},
cancel(reason) {
if (reader) {
reader.cancel(reason);
reader.releaseLock();
reader = null;
if (callbacks.complete)
callbacks.complete(reason);
}
}
}, opts);
};
}
// node_modules/web-streams-extensions/dist/esm/to-promise.js
async function toPromise(src) {
let res = undefined;
if (isReadableLike(src)) {
src = src.readable;
}
let reader = src.getReader();
let done = false;
while (done == false) {
let next = await reader.read();
done = next.done;
if (!done)
res = next.value;
}
return res;
}
// node_modules/web-streams-extensions/dist/esm/operators/merge.js
function merge(concurrent = Infinity) {
if (concurrent == 0)
throw Error("zero is an invalid concurrency limit");
return function(src) {
let outerGate = new Gate(concurrent);
let innerQueue = new BlockingQueue;
let errored = null;
return new ReadableStream({
start(outerController) {
let reading = [];
let readingDone = false;
toPromise(pipe(src, schedule({
nextTick: async () => {
await outerGate.wait();
}
}), map((innerStream) => {
if (!(innerStream instanceof ReadableStream)) {
innerStream = from(innerStream);
}
reading.push(innerStream);
pipe(innerStream, map(async (value) => {
await innerQueue.push({ done: false, value });
}), on({
error(err) {
outerController.error(err);
},
complete() {
outerGate.increment();
reading.splice(reading.indexOf(innerStream), 1);
if (reading.length == 0 && readingDone) {
innerQueue.push({ done: true });
}
}
}));
}), on({
error(err) {
outerController.error(err);
errored = err;
},
complete() {
readingDone = true;
}
}))).catch((err) => {
outerController.error(err);
});
},
async pull(controller) {
while (controller.desiredSize > 0) {
let next = await innerQueue.pull();
if (errored) {
controller.error(errored);
}
if (next.done) {
controller.close();
} else {
controller.enqueue(next.value);
}
}
},
cancel(reason) {
}
});
};
}
// node_modules/web-streams-extensions/dist/esm/to-array.js
async function toArray(src) {
let res = [];
if (isReadableLike(src)) {
src = src.readable;
}
let reader = src.getReader();
try {
let done = false;
while (done == false) {
let next = await reader.read();
done = next.done;
if (!done)
res.push(next.value);
}
} finally {
reader.releaseLock();
}
return res;
}
// src/froms.ts
var toStream = (src) => src instanceof ReadableStream ? src : from(src ?? []);
// src/maps.ts
function maps(fn) {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const ret = fn(chunk, i++);
const val = ret instanceof Promise ? await ret : ret;
ctrl.enqueue(val);
}
});
}
// src/nils.ts
function nils() {
return new WritableStream;
}
function nil() {
return null;
}
// src/concats.ts
var concats = (srcs) => {
if (!srcs)
return new TransformStream;
const upstream = new TransformStream;
return {
writable: upstream.writable,
readable: concatStream([upstream.readable, concatStream(srcs)])
};
};
var concatStream = (srcs) => {
if (!srcs)
return new ReadableStream({ start: (c) => c.close() });
const t = new TransformStream;
const w = t.writable.getWriter();
toStream(srcs).pipeThrough(maps(toStream)).pipeThrough(maps(async (s) => {
const r = s.getReader();
while (true) {
const { value, done } = await r.read();
if (done)
break;
await w.write(value);
}
})).pipeTo(nils()).then(() => w.close()).catch((reason) => w.abort(reason));
return t.readable;
};
// src/confluences.ts
var confluences = ({
order = "breadth"
} = {}) => {
if (order !== "breadth")
phpdie_default("not implemented");
const { writable, readable: sources } = new TransformStream;
const srcsQueue = [];
const readable = new ReadableStream({
async pull(ctrl) {
while (true) {
const src = await async function() {
const r2 = sources.getReader();
const { done: done2, value: src2 } = await r2.read();
r2.releaseLock();
if (done2)
return srcsQueue.shift();
return src2;
}();
if (!src)
return ctrl.close();
const r = src.getReader();
const { done, value } = await r.read();
r.releaseLock();
if (done)
continue;
srcsQueue.push(src);
ctrl.enqueue(value);
return;
}
}
});
return { writable, readable };
};
// src/convolves.ts
function convolves(n) {
const buffer2 = [];
return new TransformStream({
transform(chunk, controller) {
buffer2.push(chunk);
if (buffer2.length > n)
buffer2.shift();
if (buffer2.length === n)
controller.enqueue([...buffer2]);
},
flush(controller) {
while (buffer2.length > 1) {
buffer2.shift();
if (buffer2.length === n)
controller.enqueue([...buffer2]);
}
}
});
}
// src/debounces.ts
function debounces(t) {
let id = null;
return new TransformStream({
transform: async (chunk, ctrl) => {
if (id)
clearTimeout(id);
id = setTimeout(() => {
ctrl.enqueue(chunk);
id = null;
}, t);
},
flush: async () => {
while (id)
await new Promise((r) => setTimeout(r, t / 2));
}
});
}
// src/filters.ts
var filters = (fn) => {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
if (fn) {
const shouldEnqueue = await fn(chunk, i++);
if (shouldEnqueue)
ctrl.enqueue(chunk);
} else {
const isNull = chunk === undefined || chunk === null;
if (!isNull)
ctrl.enqueue(chunk);
}
}
});
};
// src/finds.ts
function finds(predicate) {
let index = 0;
let found = false;
return new TransformStream({
async transform(chunk, controller) {
if (found)
return;
const shouldEmit = await predicate(chunk, index++);
if (shouldEmit) {
found = true;
controller.enqueue(chunk);
controller.terminate();
}
}
});
}
// src/flatMaps.ts
function flatMaps(fn) {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const ret = fn(chunk, i++);
const val = ret instanceof Promise ? await ret : ret;
val.map((e) => ctrl.enqueue(e));
}
});
}
// src/flats.ts
function flats() {
return exports_sf.composers(exports_sf.filters((e) => e.length)).by(new TransformStream({
transform: async (a, ctrl) => {
a.map((e) => ctrl.enqueue(e));
}
}));
}
// src/forEachs.ts
function forEachs(fn) {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const ret = fn(chunk, i++);
ret instanceof Promise && await ret;
ctrl.enqueue(chunk);
}
});
}
// src/heads.ts
function heads(n = 1) {
return new TransformStream({
transform: async (chunk, ctrl) => {
return n-- > 0 ? ctrl.enqueue(chunk) : await never();
}
});
}
// src/limits.ts
function limits(n, { terminate = true } = {}) {
return new TransformStream({
transform: async (chunk, ctrl) => {
ctrl.enqueue(chunk);
if (--n === 0) {
terminate && ctrl.terminate();
return never();
}
},
flush: () => {}
}, { highWaterMark: 1 }, { highWaterMark: 0 });
}
// src/throughs.ts
var throughs = (arg) => {
if (!arg)
return new TransformStream;
if (typeof arg !== "function")
return throughs((s) => s.pipeThrough(arg));
const fn = arg;
const { writable, readable } = new TransformStream;
return { writable, readable: fn(readable) };
};
// src/lines.ts
var lines = ({ EOL = "KEEP" } = {}) => {
const CRLFMap = {
KEEP: "$1",
LF: `
`,
CRLF: `\r
`,
NONE: ""
};
return throughs((r) => r.pipeThrough(flatMaps((s) => s.split(/(?<=\n)/g))).pipeThrough(chunkIfs((ch) => ch.indexOf(`
`) === -1, { inclusive: true })).pipeThrough(maps((chunks2) => chunks2.join("").replace(/(\r?\n?)$/, CRLFMap[EOL]))));
};
// src/unpromises.ts
function unpromises(promise) {
const tr = new TransformStream;
(async function() {
const s = await promise;
await s.pipeTo(tr.writable);
})().catch((error) => {
tr.readable.cancel(error).catch(() => {
throw error;
});
}).then();
return tr.readable;
}
// src/bys.ts
function bys(arg) {
if (!arg)
return new TransformStream;
if (typeof arg !== "function")
return bys((s) => s.pipeThrough(arg));
const fn = arg;
const { writable, readable } = new TransformStream;
return { writable, readable: unpromises(fn(readable)) };
}
// src/peeks.ts
function peeks(fn) {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
ctrl.enqueue(chunk);
const ret = fn(chunk, i++);
ret instanceof Promise ? await ret : ret;
}
});
}
// src/logs.ts
function logs(mapFn = (s, i) => s) {
return bys(peeks(async (e, i) => {
const ret = mapFn(e, i);
const val = ret instanceof Promise ? await ret : ret;
console.log(typeof val === "string" ? val.replace(/\n$/, "") : val);
}));
}
// src/mapAddFields.ts
function mapAddFields(key, fn) {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => ctrl.enqueue({ ...chunk, [key]: await fn(chunk, i++) })
});
}
// src/wseMerges.ts
var wseMerges = merge;
// src/parallels.ts
var parallels = (...srcs) => wseMerges()(from(srcs));
// src/merges.ts
var merges = (...srcs) => {
if (!srcs.length)
return new TransformStream;
const upstream = new TransformStream;
return {
writable: upstream.writable,
readable: parallels(upstream.readable, ...srcs.map(toStream))
};
};
// src/streamAsyncIterator.ts
async function* streamAsyncIterator() {
const reader = this.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done)
return;
yield value;
}
} finally {
reader.releaseLock();
}
}
// src/mergeStream.ts
var mergeStream = (...srcs) => {
if (!srcs.length)
return new ReadableStream({ start: (c) => c.close() });
if (srcs.length === 1)
return toStream(srcs[0]);
const t = new TransformStream;
const w = t.writable.getWriter();
const streams = srcs.map(toStream);
Promise.all(streams.map(async (s) => {
for await (const chunk of Object.assign(s, {
[Symbol.asyncIterator]: streamAsyncIterator
}))
await w.write(chunk);
})).then(async () => w.close()).catch((error) => {
console.error(error);
return Promise.all([
t.writable.abort(error),
...streams.map((e) => e.cancel(error))
]);
});
return t.readable;
};
// src/emptyStream.ts
var emptyStream = () => new ReadableStream({ start: (c) => c.close() });
// src/mergeStreamsBy.ts
function mergeStreamsBy(transform, sources) {
if (!sources)
return (srcs) => mergeStreamsBy(transform, srcs);
if (!sources.length)
return emptyStream();
const streams = sources.map((s) => toStream(s));
const readers = streams.map((stream) => stream.getReader());
let slots = streams.map(() => null);
return new ReadableStream({
pull: async (ctrl) => {
await Promise.all(readers.map(async (reader, i) => slots[i] ??= await reader.read()));
slots = await transform([...slots], ctrl);
if (slots.length !== streams.length)
phpdie_default("slot length mismatch");
}
});
}
function mergeStreamsByAscend(ordFn, sources) {
if (!sources)
return (sources2) => mergeStreamsByAscend(ordFn, sources2);
let lastEmit = null;
return mergeStreamsBy(async (slots, ctrl) => {
const cands = slots.filter((e) => e?.done === false).map((e) => e.value);
if (!cands.length) {
ctrl.close();
return [];
}
const peak = sortBy(ordFn, cands)[0];
const index = slots.findIndex((e) => e?.done === false && e?.value === peak);
if (lastEmit && lastEmit.value !== sortBy(ordFn, [lastEmit.value, peak])[0] && ordFn(lastEmit.value) !== ordFn(peak))
throw new Error("MergeStreamError: one of sources is not ordered by ascending", {
cause: {
prevOrd: ordFn(lastEmit.value),
currOrd: ordFn(peak),
prev: lastEmit.value,
curr: peak
}
});
lastEmit = { value: peak };
ctrl.enqueue(peak);
return slots.toSpliced(index, 1, null);
}, sources);
}
function mergeStreamsByDescend(ordFn, sources) {
if (!sources)
return (srcs) => mergeStreamsByDescend(ordFn, srcs);
let lastEmit = null;
return mergeStreamsBy(async (slots, ctrl) => {
const cands = slots.filter((e) => e?.done === false).map((e) => e.value);
if (!cands.length) {
ctrl.close();
return [];
}
const peak = sortBy(ordFn, cands).toReversed()[0];
const index = slots.findIndex((e) => e?.done === false && e?.value === peak);
if (lastEmit && lastEmit.value !== sortBy(ordFn, [lastEmit.value, peak]).toReversed()[0] && ordFn(lastEmit.value) !== ordFn(peak))
phpdie_default(new Error("MergeStreamError: one of sources is not ordered by descending", {
cause: {
prevOrd: ordFn(lastEmit.value),
currOrd: ordFn(peak),
prev: lastEmit.value,
curr: peak
}
}));
lastEmit = { value: peak };
ctrl.enqueue(peak);
return slots.toSpliced(index, 1, null);
}, sources);
}
// src/pMaps.ts
var pMaps = (fn, options = {}) => {
let i = 0;
let promises = [];
return new TransformStream({
transform: async (chunk, ctrl) => {
promises.push(fn(chunk, i++));
if (promises.length >= (options.concurrency ?? Infinity))
ctrl.enqueue(await promises.shift());
},
flush: async (ctrl) => {
while (promises.length)
ctrl.enqueue(await promises.shift());
}
});
};
// src/portals.ts
var portals = (arg) => {
if (!arg)
return new TransformStream;
if (typeof arg !== "function")
return throughs((s) => s.pipeThrough(arg));
const fn = arg;
const { writable, readable } = new TransformStream;
return { writable, readable: fn(readable) };
};
// src/reduceEmits.ts
var reduceEmits = (fn, _state) => {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const { next, emit } = await fn(_state, chunk, i++);
_state = next;
ctrl.enqueue(emit);
}
});
};
// src/reduces.ts
var reduces = (fn, state) => {
let i = 0;
return new TransformStream({
transform: async (chunk, ctrl) => {
const ret = fn(state, chunk, i++);
const val = ret instanceof Promise ? await ret : ret;
state = await val;
ctrl.enqueue(state);
}
});
};
// src/riffles.ts
function riffles(sep) {
let last2;
return new TransformStream({
transform: (chunk, ctrl) => {
if (last2 !== undefined) {
ctrl.enqueue(last2);
ctrl.enqueue(sep);
}
last2 = chunk;
},
flush: (ctrl) => ctrl.enqueue(last2)
});
}
// src/skips.ts
function skips(n = 1) {
return new TransformStream({
transform: async (chunk, ctrl) => {
if (n <= 0)
ctrl.enqueue(chunk);
else
n--;
}
});
}
// src/slices.ts
function slices(start = 0, end = Infinity) {
const count = end - start;
const { readable, writable } = new TransformStream;
return {
writable,
readable: readable.pipeThrough(skips(start)).pipeThrough(limits(count))
};
}
// node_modules/string-replace-async/index.js
function replaceAsync(string, searchValue, replacer) {
try {
if (typeof replacer === "function") {
var values = [];
String.prototype.replace.call(string, searchValue, function() {
values.push(replacer.apply(undefined, arguments));
return "";
});
return Promise.all(values).then(function(resolvedValues) {
return String.prototype.replace.call(string, searchValue, function() {
return resolvedValues.shift();
});
});
} else {
return Promise.resolve(String.prototype.replace.call(string, searchValue, replacer));
}
} catch (error) {
return Promise.reject(error);
}
}
// src/strings.ts
var matchs = (matcher) => {
return new TransformStream({
transform: (chunk, ctrl) => ctrl.enqueue(chunk.match(matcher))
});
};
var matchAlls = (matcher) => {
return new TransformStream({
transform: (chunk, ctrl) => ctrl.enqueue(chunk.matchAll(matcher))
});
};
var replaces = (searchValue, replacement) => {
return maps((s) => typeof replacement === "string" ? s.replace(searchValue, replacement) : replaceAsync(s, searchValue, replacement));
};
var replaceAlls = (searchValue, replacement) => {
return maps((s) => typeof replacement === "string" ? s.replaceAll(searchValue, replacement) : replaceAsync(s, searchValue, replacement));
};
// src/tails.ts
function tails(n = 1) {
let chunks2 = [];
return new TransformStream({
transform: (chunk) => {
chunks2.push(chunk);
if (chunks2.length > n)
chunks2.shift();
},
flush: (ctrl) => {
chunks2.map((e) => ctrl.enqueue(e));
}
});
}
// src/tees.ts
var tees = (arg) => {
if (!arg)
return new TransformStream;
if (arg instanceof WritableStream)
return tees((s) => s.pipeTo(arg));
const fn = arg;
const { writable, readable } = new TransformStream;
const [a, b] = readable.tee();
fn(a);
return { writable, readable: b };
};
// src/terminates.ts
function terminates(signal) {
return throughs((r) => r.pipeThrough(new TransformStream, { signal }));
}
// src/throttles.ts
function throttles(interval, { drop = false, keepLast = true } = {}) {
let timerId = null;
let cdPromise = Promise.withResolvers();
let lasts = [];
return new TransformStream({
transform: async (chunk, ctrl) => {
if (timerId) {
if (keepLast)
lasts = [chunk];
if (drop)
return;
await cdPromise.promise;
}
lasts = [];
ctrl.enqueue(chunk);
[cdPromise, timerId] = [
Promise.withResolvers(),
setTimeout(() => {
timerId = null;
cdPromise.resolve();
}, interval)
];
},
flush: async (ctrl) => {
while (timerId)
await new Promise((r) => setTimeout(r, interval / 2));
lasts.map((e) => ctrl.enqueue(e));
}
});
}
// src/uniqs.ts
var uniqs = () => {
const set = new Set;
return throughs((s) => s.pipeThrough(filters((x) => {
if (set.has(x))
return false;
set.add(x);
return true;
})));
};
var uniqBys = (keyFn) => {
const set = new Set;
return throughs((s) => s.pipeThrough(filters(async (x) => {
const key = await keyFn(x);
if (set.has(key))
return false;
set.add(key);
return true;
})));
};
// src/unwinds.ts
var import_unwind_array = __toESM(require_src());
function unwinds(key) {
return flatMaps((e) => import_unwind_array.unwind(e, { path: key }));
}
// node_modules/d3-dispatch/src/dispatch.js
var noop = { value: () => {} };
function dispatch() {
for (var i = 0, n = arguments.length, _ = {}, t;i < n; ++i) {
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t))
throw new Error("illegal type: " + t);
_[t] = [];
}
return new Dispatch(_);
}
function Dispatch(_) {
this._ = _;
}
function parseTypenames(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0)
name = t.slice(i + 1), t = t.slice(0, i);
if (t && !types.hasOwnProperty(t))
throw new Error("unknown type: " + t);
return { type: t, name };
});
}
Dispatch.prototype = dispatch.prototype = {
constructor: Dispatch,
on: function(typename, callback) {
var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length;
if (arguments.length < 2) {
while (++i < n)
if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name)))
return t;
return;
}
if (callback != null && typeof callback !== "function")
throw new Error("invalid callback: " + callback);
while (++i < n) {
if (t = (typename = T[i]).type)
_[t] = set(_[t], typename.name, callback);
else if (callback == null)
for (t in _)
_[t] = set(_[t], typename.name, null);
}
return this;
},
copy: function() {
var copy = {}, _ = this._;
for (var t in _)
copy[t] = _[t].slice();
return new Dispatch(copy);
},
call: function(type2, that) {
if ((n = arguments.length - 2) > 0)
for (var args = new Array(n), i = 0, n, t;i < n; ++i)
args[i] = arguments[i + 2];
if (!this._.hasOwnProperty(type2))
throw new Error("unknown type: " + type2);
for (t = this._[type2], i = 0, n = t.length;i < n; ++i)
t[i].value.apply(that, args);
},
apply: function(type2, that, args) {
if (!this._.hasOwnProperty(type2))
throw new Error("unknown type: " + type2);
for (var t = this._[type2], i = 0, n = t.length;i < n; ++i)
t[i].value.apply(that, args);
}
};
function get(type2, name) {
for (var i = 0, n = type2.length, c;i < n; ++i) {
if ((c = type2[i]).name === name) {
return c.value;
}
}
}
function set(type2, name, callback) {
for (var i = 0, n = type2.length;i < n; ++i) {
if (type2[i].name === name) {
type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));
break;
}
}
if (callback != null)
type2.push({ name, value: callback });
return type2;
}
var dispatch_default = dispatch;
// node_modules/d3-selection/src/namespaces.js
var xhtml = "http://www.w3.org/1999/xhtml";
var namespaces_default = {
svg: "http://www.w3.org/2000/svg",
xhtml,
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
};
// node_modules/d3-selection/src/namespace.js
function namespace_default(name) {
var prefix = name += "", i = prefix.indexOf(":");
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns")
name = name.slice(i + 1);
return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name;
}
// node_modules/d3-selection/src/creator.js
function creatorInherit(name) {
return function() {
var document2 = this.ownerDocument, uri = this.namespaceURI;
return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name);
};
}
function creatorFixed(fullname) {
return function() {
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
};
}
function creator_default(name) {
var fullname = namespace_default(name);
return (fullname.local ? creatorFixed : creatorInherit)(fullname);
}
// node_modules/d3-selection/src/selector.js
function none() {}
function selector_default(selector) {
return selector == null ? none : function() {
return this.querySelector(selector);
};
}
// node_modules/d3-selection/src/selection/select.js
function select_default(select) {
if (typeof select !== "function")
select = selector_default(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0;j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0;i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node)
subnode.__data__ = node.__data__;
subgroup[i] = subnode;
}
}
}
return new Selection(subgroups, this._parents);
}
// node_modules/d3-selection/src/array.js
function array(x) {
return x == null ? [] : Array.isArray(x) ? x : Array.from(x);
}
// node_modules/d3-selection/src/selectorAll.js
function empty() {
return [];
}
function selectorAll_default(selector) {
return selector == null ? empty : function() {
return this.querySelectorAll(selector);
};
}
// node_modules/d3-selection/src/selection/selectAll.js
function arrayAll(select) {
return function() {
return array(select.apply(this, arguments));
};
}
function selectAll_default(select) {
if (typeof select === "function")
select = arrayAll(select);
else
select = selectorAll_default(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0;j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0;i < n; ++i) {
if (node = group[i]) {
subgroups.push(select.call(node, node.__data__, i, group));
parents.push(node);
}
}
}
return new Selection(subgroups, parents);
}
// node_modules/d3-selection/src/matcher.js
function matcher_default(selector) {
return function() {
return this.matches(selector);
};
}
function childMatcher(selector) {
return function(node) {
return node.matches(selector);
};
}
// node_modules/d3-selection/src/selection/selectChild.js
var find = Array.prototype.find;
function childFind(match) {
return function() {
return find.call(this.children, match);
};
}
function childFirst() {
return this.firstElementChild;
}
function selectChild_default(match) {
return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
}
// node_modules/d3-selection/src/selection/selectChildren.js
var filter2 = Array.prototype.filter;
function children() {
return Array.from(this.children);
}
function childrenFilter(match) {
return function() {
return filter2.call(this.children, match);
};
}
function selectChildren_default(match) {
return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
}
// node_modules/d3-selection/src/selection/filter.js
function filter_default(match) {
if (typeof match !== "function")
match = matcher_default(match);
for (var groups = this._groups, m = gr