reactor-core-ts 3.2.3 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/core/demand.d.ts +4 -0
  2. package/dist/core/demand.d.ts.map +1 -1
  3. package/dist/core/demand.js +12 -4
  4. package/dist/core/demand.js.map +1 -1
  5. package/dist/internal/iteration-demand.d.ts +18 -0
  6. package/dist/internal/iteration-demand.d.ts.map +1 -0
  7. package/dist/internal/iteration-demand.js +34 -0
  8. package/dist/internal/iteration-demand.js.map +1 -0
  9. package/dist/internal/publisher-terminal.d.ts +25 -0
  10. package/dist/internal/publisher-terminal.d.ts.map +1 -0
  11. package/dist/internal/publisher-terminal.js +128 -0
  12. package/dist/internal/publisher-terminal.js.map +1 -0
  13. package/dist/publisher/flux.d.ts.map +1 -1
  14. package/dist/publisher/flux.js +22 -12
  15. package/dist/publisher/flux.js.map +1 -1
  16. package/dist/publisher/mono.d.ts.map +1 -1
  17. package/dist/publisher/mono.js +2 -1
  18. package/dist/publisher/mono.js.map +1 -1
  19. package/dist/publisher/operators/aggregate.d.ts.map +1 -1
  20. package/dist/publisher/operators/aggregate.js +136 -143
  21. package/dist/publisher/operators/aggregate.js.map +1 -1
  22. package/dist/publisher/operators/buffer-lift.d.ts +5 -0
  23. package/dist/publisher/operators/buffer-lift.d.ts.map +1 -0
  24. package/dist/publisher/operators/buffer-lift.js +197 -0
  25. package/dist/publisher/operators/buffer-lift.js.map +1 -0
  26. package/dist/publisher/operators/compat/flux.d.ts.map +1 -1
  27. package/dist/publisher/operators/compat/flux.js +86 -35
  28. package/dist/publisher/operators/compat/flux.js.map +1 -1
  29. package/dist/publisher/operators/coordination.d.ts.map +1 -1
  30. package/dist/publisher/operators/coordination.js +3 -4
  31. package/dist/publisher/operators/coordination.js.map +1 -1
  32. package/dist/publisher/operators/lifecycle.d.ts.map +1 -1
  33. package/dist/publisher/operators/lifecycle.js +64 -21
  34. package/dist/publisher/operators/lifecycle.js.map +1 -1
  35. package/dist/publisher/operators/lift.d.ts +2 -0
  36. package/dist/publisher/operators/lift.d.ts.map +1 -1
  37. package/dist/publisher/operators/lift.js +173 -3
  38. package/dist/publisher/operators/lift.js.map +1 -1
  39. package/dist/publisher/operators/selection.d.ts.map +1 -1
  40. package/dist/publisher/operators/selection.js +3 -2
  41. package/dist/publisher/operators/selection.js.map +1 -1
  42. package/dist/publisher/operators/terminal-mono.d.ts +12 -0
  43. package/dist/publisher/operators/terminal-mono.d.ts.map +1 -0
  44. package/dist/publisher/operators/terminal-mono.js +244 -0
  45. package/dist/publisher/operators/terminal-mono.js.map +1 -0
  46. package/dist/publisher/operators/terminal.d.ts.map +1 -1
  47. package/dist/publisher/operators/terminal.js +12 -25
  48. package/dist/publisher/operators/terminal.js.map +1 -1
  49. package/dist/publisher/operators/time.d.ts.map +1 -1
  50. package/dist/publisher/operators/time.js +2 -0
  51. package/dist/publisher/operators/time.js.map +1 -1
  52. package/dist/subscription/iterable-subscription.d.ts.map +1 -1
  53. package/dist/subscription/iterable-subscription.js +5 -2
  54. package/dist/subscription/iterable-subscription.js.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/internal/iterable-terminal.d.ts +0 -12
  57. package/dist/internal/iterable-terminal.d.ts.map +0 -1
  58. package/dist/internal/iterable-terminal.js +0 -49
  59. package/dist/internal/iterable-terminal.js.map +0 -1
@@ -1,20 +1,21 @@
1
- import { isAsyncIterable } from "../../internal/iterable.js";
1
+ import { UNBOUNDED_DEMAND } from "../../core/demand.js";
2
2
  import { NoSuchElementError } from "../../errors/classes.js";
3
3
  import { AsyncQueue } from "../../internal/async-queue.js";
4
- import { collectIterable, countIterable } from "../../internal/iterable-terminal.js";
5
4
  import { Flux } from "../flux.js";
6
- import { Mono } from "../mono.js";
5
+ import { liftOneToOne } from "./lift.js";
6
+ import { liftBuffer } from "./buffer-lift.js";
7
+ import { NO_TERMINAL_VALUE, terminalMono } from "./terminal-mono.js";
7
8
  //#region src/publisher/operators/aggregate.ts
8
9
  /**
9
10
  * @packageDocumentation
10
11
  * Flux, Mono and operator implementation modules.
11
12
  */
12
13
  /** Sentinel used when a terminal operation completes without emitting. */
13
- var NO_VALUE = Symbol("no-value");
14
+ var NO_VALUE = NO_TERMINAL_VALUE;
14
15
  Flux.prototype.buffer = function buffer(size) {
15
16
  if (!Number.isInteger(size) || size <= 0) throw new RangeError("buffer size must be a strictly positive integer");
16
17
  const source = this;
17
- return new Flux(async function* (signal, context) {
18
+ return liftBuffer(source, async function* (signal, context) {
18
19
  let bucket = [];
19
20
  for await (const value of source.iterate(signal, context)) {
20
21
  bucket.push(value);
@@ -24,11 +25,11 @@ Flux.prototype.buffer = function buffer(size) {
24
25
  }
25
26
  }
26
27
  if (bucket.length > 0) yield bucket;
27
- });
28
+ }, size);
28
29
  };
29
30
  Flux.prototype.window = function window(size) {
30
31
  const buffers = this.buffer(size);
31
- return new Flux((signal, context) => {
32
+ return liftOneToOne(buffers, (signal, context) => {
32
33
  const queue = new AsyncQueue(signal);
33
34
  (async () => {
34
35
  try {
@@ -39,172 +40,164 @@ Flux.prototype.window = function window(size) {
39
40
  }
40
41
  })();
41
42
  return queue;
42
- });
43
+ }, () => ({ onNext: (values) => Flux.fromIterable(values) }));
43
44
  };
44
45
  Flux.prototype.scan = function scan(seedOrAccumulator, accumulator) {
45
46
  const source = this;
46
- return new Flux(async function* (signal, context) {
47
- if (accumulator) {
48
- let current = seedOrAccumulator;
47
+ if (accumulator) return new Flux(async function* (signal, context) {
48
+ let current = seedOrAccumulator;
49
+ yield current;
50
+ for await (const value of source.iterate(signal, context)) {
51
+ current = accumulator(current, value);
52
+ yield current;
53
+ }
54
+ });
55
+ const reduceValues = seedOrAccumulator;
56
+ return liftOneToOne(source, async function* (signal, context) {
57
+ let initialized = false;
58
+ let current;
59
+ for await (const value of source.iterate(signal, context)) if (!initialized) {
60
+ current = value;
61
+ initialized = true;
49
62
  yield current;
50
- for await (const value of source.iterate(signal, context)) {
51
- current = accumulator(current, value);
52
- yield current;
53
- }
54
63
  } else {
55
- let initialized = false;
56
- let current;
57
- const acc = seedOrAccumulator;
58
- for await (const value of source.iterate(signal, context)) if (!initialized) {
59
- current = value;
60
- initialized = true;
61
- yield current;
62
- } else {
63
- current = acc(current, value);
64
- yield current;
65
- }
64
+ current = reduceValues(current, value);
65
+ yield current;
66
66
  }
67
+ }, () => {
68
+ let initialized = false;
69
+ let current;
70
+ return {
71
+ /** Produces the next running accumulation. */
72
+ onNext(value) {
73
+ current = initialized ? reduceValues(current, value) : value;
74
+ initialized = true;
75
+ return current;
76
+ } };
67
77
  });
68
78
  };
69
79
  Flux.prototype.reduce = function reduce(seedOrAccumulator, accumulator) {
70
- return terminalMono(this, (values) => accumulator ? reduceSeed(values, seedOrAccumulator, accumulator) : reduceNoSeed(values, seedOrAccumulator));
80
+ if (accumulator) {
81
+ const seed = seedOrAccumulator;
82
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
83
+ let current = seed;
84
+ return {
85
+ /** Folds one source value into the seeded result. */
86
+ onNext(value) {
87
+ current = accumulator(current, value);
88
+ return false;
89
+ },
90
+ result: () => current
91
+ };
92
+ });
93
+ }
94
+ const reduceValues = seedOrAccumulator;
95
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
96
+ let initialized = false;
97
+ let current;
98
+ return {
99
+ /** Uses the first value as the seed and folds later values. */
100
+ onNext(value) {
101
+ current = initialized ? reduceValues(current, value) : value;
102
+ initialized = true;
103
+ return false;
104
+ },
105
+ result: () => initialized ? current : NO_VALUE
106
+ };
107
+ });
71
108
  };
72
109
  Flux.prototype.collectList = function collectList() {
73
- return terminalMono(this, collectIterable);
110
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
111
+ const values = [];
112
+ return {
113
+ /** Appends one value to the collected list. */
114
+ onNext(value) {
115
+ values.push(value);
116
+ return false;
117
+ },
118
+ result: () => values
119
+ };
120
+ });
74
121
  };
75
122
  Flux.prototype.count = function count() {
76
- return terminalMono(this, countIterable);
123
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
124
+ let count = 0;
125
+ return {
126
+ /** Counts one source value. */
127
+ onNext() {
128
+ count += 1;
129
+ return false;
130
+ },
131
+ result: () => count
132
+ };
133
+ });
77
134
  };
78
135
  Flux.prototype.any = function any(predicate) {
79
- return terminalMono(this, (values) => anyValue(values, predicate));
136
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
137
+ let matched = false;
138
+ return {
139
+ /** Tests one value and finishes on the first match. */
140
+ onNext(value) {
141
+ matched = predicate(value);
142
+ return matched;
143
+ },
144
+ result: () => matched
145
+ };
146
+ });
80
147
  };
81
148
  Flux.prototype.all = function all(predicate) {
82
- return terminalMono(this, (values) => allValue(values, predicate));
149
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
150
+ let matched = true;
151
+ return {
152
+ /** Tests one value and finishes on the first mismatch. */
153
+ onNext(value) {
154
+ matched = predicate(value);
155
+ return !matched;
156
+ },
157
+ result: () => matched
158
+ };
159
+ });
83
160
  };
84
161
  Flux.prototype.hasElement = function hasElement(value) {
85
162
  return this.any((next) => Object.is(next, value));
86
163
  };
87
164
  Flux.prototype.next = function next() {
88
- return terminalMono(this, firstValue);
165
+ return terminalMono(this, 1, () => {
166
+ let result = NO_VALUE;
167
+ return {
168
+ /** Captures the first value and finishes immediately. */
169
+ onNext(value) {
170
+ result = value;
171
+ return true;
172
+ },
173
+ result: () => result
174
+ };
175
+ });
89
176
  };
90
177
  Flux.prototype.single = function single(defaultValue) {
91
178
  const hasDefault = arguments.length > 0;
92
- return terminalMono(this, (values) => singleValue(values, false, hasDefault, defaultValue));
179
+ return singleTerminal(this, false, hasDefault, defaultValue);
93
180
  };
94
181
  Flux.prototype.singleOrEmpty = function singleOrEmpty() {
95
- return terminalMono(this, (values) => singleValue(values, true));
182
+ return singleTerminal(this, true, false);
96
183
  };
97
- /** Creates a Mono from a terminal iterable computation while preserving sync sources. */
98
- function terminalMono(source, evaluate) {
99
- return new Mono((signal, context) => {
100
- const values = source.iterate(signal, context);
101
- return isAsyncIterable(values) ? emitAsync(() => evaluate(values)) : emitSync(() => evaluate(values));
184
+ /** Creates a bounded terminal Mono that validates a source has at most one value. */
185
+ function singleTerminal(source, emptyIsAllowed, hasDefault = false, defaultValue) {
186
+ return terminalMono(source, 2, () => {
187
+ let seen = false;
188
+ let value;
189
+ return {
190
+ /** Captures one value and rejects a second source value. */
191
+ onNext(next) {
192
+ if (seen) throw new Error("Source emitted more than one item");
193
+ seen = true;
194
+ value = next;
195
+ return false;
196
+ },
197
+ result: () => singleResult(seen ? value : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue)
198
+ };
102
199
  });
103
200
  }
104
- /** Emits a terminal sync value unless it represents an empty Mono. */
105
- function emitSync(producer) {
106
- return (function* () {
107
- const value = producer();
108
- if (value !== NO_VALUE) yield value;
109
- })();
110
- }
111
- /** Emits a terminal async value unless it represents an empty Mono. */
112
- function emitAsync(producer) {
113
- return (async function* () {
114
- const value = await producer();
115
- if (value !== NO_VALUE) yield value;
116
- })();
117
- }
118
- /** Reduces values with an explicit seed. */
119
- function reduceSeed(values, seed, accumulator) {
120
- if (isAsyncIterable(values)) return (async () => {
121
- let current = seed;
122
- for await (const value of values) current = accumulator(current, value);
123
- return current;
124
- })();
125
- let current = seed;
126
- for (const value of values) current = accumulator(current, value);
127
- return current;
128
- }
129
- /** Reduces values using the first value as the seed. */
130
- function reduceNoSeed(values, accumulator) {
131
- if (isAsyncIterable(values)) return (async () => {
132
- let initialized = false;
133
- let current;
134
- for await (const value of values) {
135
- current = initialized ? accumulator(current, value) : value;
136
- initialized = true;
137
- }
138
- return initialized ? current : NO_VALUE;
139
- })();
140
- let initialized = false;
141
- let current;
142
- for (const value of values) {
143
- current = initialized ? accumulator(current, value) : value;
144
- initialized = true;
145
- }
146
- return initialized ? current : NO_VALUE;
147
- }
148
- /** Returns true when any value matches the predicate. */
149
- function anyValue(values, predicate) {
150
- if (isAsyncIterable(values)) return (async () => {
151
- for await (const value of values) if (predicate(value)) return true;
152
- return false;
153
- })();
154
- for (const value of values) if (predicate(value)) return true;
155
- return false;
156
- }
157
- /** Returns true when every value matches the predicate. */
158
- function allValue(values, predicate) {
159
- if (isAsyncIterable(values)) return (async () => {
160
- for await (const value of values) if (!predicate(value)) return false;
161
- return true;
162
- })();
163
- for (const value of values) if (!predicate(value)) return false;
164
- return true;
165
- }
166
- /** Returns the first value and closes the source iterator early. */
167
- function firstValue(values) {
168
- if (isAsyncIterable(values)) return (async () => {
169
- const iterator = values[Symbol.asyncIterator]();
170
- try {
171
- const next = await iterator.next();
172
- return next.done ? NO_VALUE : next.value;
173
- } finally {
174
- await iterator.return?.();
175
- }
176
- })();
177
- const iterator = values[Symbol.iterator]();
178
- try {
179
- const next = iterator.next();
180
- return next.done ? NO_VALUE : next.value;
181
- } finally {
182
- iterator.return?.();
183
- }
184
- }
185
- /** Returns the only value, a default value or the empty sentinel. */
186
- function singleValue(values, emptyIsAllowed, hasDefault = false, defaultValue) {
187
- if (isAsyncIterable(values)) return (async () => singleResult(await collectSingle(values), emptyIsAllowed, hasDefault, defaultValue))();
188
- let seen = false;
189
- let result;
190
- for (const value of values) {
191
- if (seen) throw new Error("Source emitted more than one item");
192
- seen = true;
193
- result = value;
194
- }
195
- return singleResult(seen ? result : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue);
196
- }
197
- /** Collects exactly one async value or returns the empty sentinel. */
198
- async function collectSingle(values) {
199
- let seen = false;
200
- let result;
201
- for await (const value of values) {
202
- if (seen) throw new Error("Source emitted more than one item");
203
- seen = true;
204
- result = value;
205
- }
206
- return seen ? result : NO_VALUE;
207
- }
208
201
  /** Resolves single-value empty/default behavior. */
209
202
  function singleResult(value, emptyIsAllowed, hasDefault, defaultValue) {
210
203
  if (value !== NO_VALUE) return value;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","names":[],"sources":["../../../src/publisher/operators/aggregate.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport {NoSuchElementError} from \"@/errors/classes.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {type AnyIterable, isAsyncIterable} from \"@/internal/iterable.js\";\nimport {collectIterable, countIterable} from \"@/internal/iterable-terminal.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {Mono} from \"@/publisher/mono.js\";\n\n/** Sentinel used when a terminal operation completes without emitting. */\nconst NO_VALUE = Symbol(\"no-value\");\n\n/** Terminal operation result that may represent an empty Mono. */\ntype MaybeValue<T> = T | typeof NO_VALUE;\n\ndeclare module \"@/publisher/flux.js\" {\n /** Aggregate and terminal count-style operators added to Flux. */\n interface Flux<T> {\n /** Groups source values into arrays of `size`, with a final partial buffer when needed. */\n buffer(size: number): Flux<T[]>;\n\n /** Splits source values into finite Flux windows containing up to `size` values each. */\n window(size: number): Flux<Flux<T>>;\n\n /** Emits the seed and each accumulated value produced from the source. */\n scan<R>(seed: R, accumulator: (accumulated: R, value: T) => R): Flux<R>;\n\n /** Emits running accumulated values, using the first source value as the initial state. */\n scan(accumulator: (accumulated: T, value: T) => T): Flux<T>;\n\n /** Reduces source values into one value, using the first value as the initial state. */\n reduce(accumulator: (left: T, right: T) => T): Mono<T>;\n\n /** Reduces source values into one value starting from the provided seed. */\n reduce<R>(seed: R, accumulator: (left: R, right: T) => R): Mono<R>;\n\n /** Collects all source values into an array emitted after completion. */\n collectList(): Mono<T[]>;\n\n /** Counts source values and emits the final count after completion. */\n count(): Mono<number>;\n\n /** Emits true when at least one source value matches the predicate. */\n any(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true only when every source value matches the predicate. */\n all(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true when a source value matches `value` by `Object.is`. */\n hasElement(value: T): Mono<boolean>;\n\n /** Emits the first source value, or completes empty when the source has none. */\n next(): Mono<T>;\n\n /** Emits the only source value, an optional default for empty sources, or fails on multiple values. */\n single(defaultValue?: T): Mono<T>;\n\n /** Emits the only source value, completes empty for empty sources, or fails on multiple values. */\n singleOrEmpty(): Mono<T>;\n }\n}\n\nFlux.prototype.buffer = function buffer<T>(this: Flux<T>, size: number): Flux<T[]> {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(\"buffer size must be a strictly positive integer\");\n }\n const source = this;\n return new Flux(async function* (signal, context) {\n let bucket: T[] = [];\n for await (const value of source.iterate(signal, context)) {\n bucket.push(value);\n if (bucket.length === size) {\n yield bucket;\n bucket = [];\n }\n }\n if (bucket.length > 0) {\n yield bucket;\n }\n });\n};\n\nFlux.prototype.window = function window<T>(this: Flux<T>, size: number): Flux<Flux<T>> {\n const buffers = this.buffer(size);\n return new Flux((signal, context) => {\n const queue = new AsyncQueue<Flux<T>>(signal);\n void (async () => {\n try {\n for await (const values of buffers.iterate(signal, context)) {\n queue.push(Flux.fromIterable(values));\n }\n queue.complete();\n } catch (error) {\n queue.error(error);\n }\n })();\n return queue;\n });\n};\n\nFlux.prototype.scan = function scan<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((accumulated: T, value: T) => T),\n accumulator?: (accumulated: R, value: T) => R\n): Flux<R | T> {\n const source = this;\n return new Flux(async function* (signal, context) {\n if (accumulator) {\n let current = seedOrAccumulator as R;\n yield current;\n for await (const value of source.iterate(signal, context)) {\n current = accumulator(current, value);\n yield current;\n }\n } else {\n let initialized = false;\n let current: T | undefined;\n const acc = seedOrAccumulator as (accumulated: T, value: T) => T;\n for await (const value of source.iterate(signal, context)) {\n if (!initialized) {\n current = value;\n initialized = true;\n yield current;\n } else {\n current = acc(current as T, value);\n yield current;\n }\n }\n }\n });\n};\n\nFlux.prototype.reduce = function reduce<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((left: T, right: T) => T),\n accumulator?: (left: R, right: T) => R\n): Mono<R | T> {\n return terminalMono(this, values => accumulator\n ? reduceSeed(values, seedOrAccumulator as R, accumulator)\n : reduceNoSeed(values, seedOrAccumulator as (left: T, right: T) => T));\n};\n\nFlux.prototype.collectList = function collectList<T>(this: Flux<T>): Mono<T[]> {\n return terminalMono(this, collectIterable);\n};\n\nFlux.prototype.count = function count<T>(this: Flux<T>): Mono<number> {\n return terminalMono(this, countIterable);\n};\n\nFlux.prototype.any = function any<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, values => anyValue(values, predicate));\n};\n\nFlux.prototype.all = function all<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, values => allValue(values, predicate));\n};\n\nFlux.prototype.hasElement = function hasElement<T>(this: Flux<T>, value: T): Mono<boolean> {\n return this.any(next => Object.is(next, value));\n};\n\nFlux.prototype.next = function next<T>(this: Flux<T>): Mono<T> {\n return terminalMono(this, firstValue);\n};\n\nFlux.prototype.single = function single<T>(this: Flux<T>, defaultValue?: T): Mono<T> {\n const hasDefault = arguments.length > 0;\n return terminalMono(this, values => singleValue(values, false, hasDefault, defaultValue));\n};\n\nFlux.prototype.singleOrEmpty = function singleOrEmpty<T>(this: Flux<T>): Mono<T> {\n return terminalMono(this, values => singleValue<T>(values, true));\n};\n\n/** Creates a Mono from a terminal iterable computation while preserving sync sources. */\nfunction terminalMono<T, R>(\n source: Flux<T>,\n evaluate: (values: AnyIterable<T>) => MaybeValue<R> | Promise<MaybeValue<R>>\n): Mono<R> {\n return new Mono((signal, context) => {\n const values = source.iterate(signal, context);\n return isAsyncIterable<T>(values) ? emitAsync(() => evaluate(values)) : emitSync(() => evaluate(values) as MaybeValue<R>);\n });\n}\n\n/** Emits a terminal sync value unless it represents an empty Mono. */\nfunction emitSync<T>(producer: () => MaybeValue<T>): Iterable<T> {\n return (function* () {\n const value = producer();\n if (value !== NO_VALUE) {\n yield value as T;\n }\n })();\n}\n\n/** Emits a terminal async value unless it represents an empty Mono. */\nfunction emitAsync<T>(producer: () => MaybeValue<T> | Promise<MaybeValue<T>>): AsyncIterable<T> {\n return (async function* () {\n const value = await producer();\n if (value !== NO_VALUE) {\n yield value as T;\n }\n })();\n}\n\n/** Reduces values with an explicit seed. */\nfunction reduceSeed<T, R>(\n values: AnyIterable<T>,\n seed: R,\n accumulator: (left: R, right: T) => R\n): R | Promise<R> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n let current = seed;\n for await (const value of values) {\n current = accumulator(current, value);\n }\n return current;\n })();\n }\n let current = seed;\n for (const value of values) {\n current = accumulator(current, value);\n }\n return current;\n}\n\n/** Reduces values using the first value as the seed. */\nfunction reduceNoSeed<T>(\n values: AnyIterable<T>,\n accumulator: (left: T, right: T) => T\n): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n let initialized = false;\n let current: T | undefined;\n for await (const value of values) {\n current = initialized ? accumulator(current as T, value) : value;\n initialized = true;\n }\n return initialized ? current as T : NO_VALUE;\n })();\n }\n let initialized = false;\n let current: T | undefined;\n for (const value of values) {\n current = initialized ? accumulator(current as T, value) : value;\n initialized = true;\n }\n return initialized ? current as T : NO_VALUE;\n}\n\n/** Returns true when any value matches the predicate. */\nfunction anyValue<T>(values: AnyIterable<T>, predicate: (value: T) => boolean): boolean | Promise<boolean> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n for await (const value of values) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n })();\n }\n for (const value of values) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n}\n\n/** Returns true when every value matches the predicate. */\nfunction allValue<T>(values: AnyIterable<T>, predicate: (value: T) => boolean): boolean | Promise<boolean> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n for await (const value of values) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n })();\n }\n for (const value of values) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n}\n\n/** Returns the first value and closes the source iterator early. */\nfunction firstValue<T>(values: AnyIterable<T>): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n const iterator = values[Symbol.asyncIterator]();\n try {\n const next = await iterator.next();\n return next.done ? NO_VALUE : next.value;\n } finally {\n await iterator.return?.();\n }\n })();\n }\n const iterator = values[Symbol.iterator]();\n try {\n const next = iterator.next();\n return next.done ? NO_VALUE : next.value;\n } finally {\n iterator.return?.();\n }\n}\n\n/** Returns the only value, a default value or the empty sentinel. */\nfunction singleValue<T>(\n values: AnyIterable<T>,\n emptyIsAllowed: boolean,\n hasDefault = false,\n defaultValue?: T\n): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => singleResult(await collectSingle(values), emptyIsAllowed, hasDefault, defaultValue))();\n }\n let seen = false;\n let result: T | undefined;\n for (const value of values) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n result = value;\n }\n return singleResult(seen ? result as T : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue);\n}\n\n/** Collects exactly one async value or returns the empty sentinel. */\nasync function collectSingle<T>(values: AsyncIterable<T>): Promise<MaybeValue<T>> {\n let seen = false;\n let result: T | undefined;\n for await (const value of values) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n result = value;\n }\n return seen ? result as T : NO_VALUE;\n}\n\n/** Resolves single-value empty/default behavior. */\nfunction singleResult<T>(\n value: MaybeValue<T>,\n emptyIsAllowed: boolean,\n hasDefault: boolean,\n defaultValue: T | undefined\n): MaybeValue<T> {\n if (value !== NO_VALUE) {\n return value;\n }\n if (hasDefault) {\n return defaultValue as T;\n }\n if (emptyIsAllowed) {\n return NO_VALUE;\n }\n throw new NoSuchElementError();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"aggregate.js","names":[],"sources":["../../../src/publisher/operators/aggregate.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport {NoSuchElementError} from \"@/errors/classes.js\";\nimport {UNBOUNDED_DEMAND} from \"@/core/demand.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {Mono} from \"@/publisher/mono.js\";\nimport {liftBuffer} from \"@/publisher/operators/buffer-lift.js\";\nimport {liftOneToOne} from \"@/publisher/operators/lift.js\";\nimport {NO_TERMINAL_VALUE, terminalMono} from \"@/publisher/operators/terminal-mono.js\";\n\n/** Sentinel used when a terminal operation completes without emitting. */\nconst NO_VALUE: typeof NO_TERMINAL_VALUE = NO_TERMINAL_VALUE;\n\n/** Terminal operation result that may represent an empty Mono. */\ntype MaybeValue<T> = T | typeof NO_VALUE;\n\ndeclare module \"@/publisher/flux.js\" {\n /** Aggregate and terminal count-style operators added to Flux. */\n interface Flux<T> {\n /** Groups source values into arrays of `size`, with a final partial buffer when needed. */\n buffer(size: number): Flux<T[]>;\n\n /** Splits source values into finite Flux windows containing up to `size` values each. */\n window(size: number): Flux<Flux<T>>;\n\n /** Emits the seed and each accumulated value produced from the source. */\n scan<R>(seed: R, accumulator: (accumulated: R, value: T) => R): Flux<R>;\n\n /** Emits running accumulated values, using the first source value as the initial state. */\n scan(accumulator: (accumulated: T, value: T) => T): Flux<T>;\n\n /** Reduces source values into one value, using the first value as the initial state. */\n reduce(accumulator: (left: T, right: T) => T): Mono<T>;\n\n /** Reduces source values into one value starting from the provided seed. */\n reduce<R>(seed: R, accumulator: (left: R, right: T) => R): Mono<R>;\n\n /** Collects all source values into an array emitted after completion. */\n collectList(): Mono<T[]>;\n\n /** Counts source values and emits the final count after completion. */\n count(): Mono<number>;\n\n /** Emits true when at least one source value matches the predicate. */\n any(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true only when every source value matches the predicate. */\n all(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true when a source value matches `value` by `Object.is`. */\n hasElement(value: T): Mono<boolean>;\n\n /** Emits the first source value, or completes empty when the source has none. */\n next(): Mono<T>;\n\n /** Emits the only source value, an optional default for empty sources, or fails on multiple values. */\n single(defaultValue?: T): Mono<T>;\n\n /** Emits the only source value, completes empty for empty sources, or fails on multiple values. */\n singleOrEmpty(): Mono<T>;\n }\n}\n\nFlux.prototype.buffer = function buffer<T>(this: Flux<T>, size: number): Flux<T[]> {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(\"buffer size must be a strictly positive integer\");\n }\n const source = this;\n return liftBuffer(\n source,\n async function* (signal, context) {\n let bucket: T[] = [];\n for await (const value of source.iterate(signal, context)) {\n bucket.push(value);\n if (bucket.length === size) {\n yield bucket;\n bucket = [];\n }\n }\n if (bucket.length > 0) {\n yield bucket;\n }\n },\n size\n );\n};\n\nFlux.prototype.window = function window<T>(this: Flux<T>, size: number): Flux<Flux<T>> {\n const buffers = this.buffer(size);\n return liftOneToOne(\n buffers,\n (signal, context) => {\n const queue = new AsyncQueue<Flux<T>>(signal);\n void (async () => {\n try {\n for await (const values of buffers.iterate(signal, context)) {\n queue.push(Flux.fromIterable(values));\n }\n queue.complete();\n } catch (error) {\n queue.error(error);\n }\n })();\n return queue;\n },\n () => ({onNext: values => Flux.fromIterable(values)})\n );\n};\n\nFlux.prototype.scan = function scan<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((accumulated: T, value: T) => T),\n accumulator?: (accumulated: R, value: T) => R\n): Flux<R | T> {\n const source = this;\n if (accumulator) {\n return new Flux(async function* (signal, context) {\n let current = seedOrAccumulator as R;\n yield current;\n for await (const value of source.iterate(signal, context)) {\n current = accumulator(current, value);\n yield current;\n }\n });\n }\n const reduceValues = seedOrAccumulator as (accumulated: T, value: T) => T;\n return liftOneToOne(\n source,\n async function* (signal, context) {\n let initialized = false;\n let current: T | undefined;\n for await (const value of source.iterate(signal, context)) {\n if (!initialized) {\n current = value;\n initialized = true;\n yield current;\n } else {\n current = reduceValues(current as T, value);\n yield current;\n }\n }\n },\n () => {\n let initialized = false;\n let current: T | undefined;\n return {\n /** Produces the next running accumulation. */\n onNext(value: T) {\n current = initialized ? reduceValues(current as T, value) : value;\n initialized = true;\n return current;\n }\n };\n }\n );\n};\n\nFlux.prototype.reduce = function reduce<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((left: T, right: T) => T),\n accumulator?: (left: R, right: T) => R\n): Mono<R | T> {\n if (accumulator) {\n const seed = seedOrAccumulator as R;\n return terminalMono<T, R | T>(this, UNBOUNDED_DEMAND, () => {\n let current = seed;\n return {\n /** Folds one source value into the seeded result. */\n onNext(value) {\n current = accumulator(current, value);\n return false;\n },\n result: () => current\n };\n });\n }\n const reduceValues = seedOrAccumulator as (left: T, right: T) => T;\n return terminalMono<T, R | T>(this, UNBOUNDED_DEMAND, () => {\n let initialized = false;\n let current: T | undefined;\n return {\n /** Uses the first value as the seed and folds later values. */\n onNext(value) {\n current = initialized ? reduceValues(current as T, value) : value;\n initialized = true;\n return false;\n },\n result: () => initialized ? current as T : NO_VALUE\n };\n });\n};\n\nFlux.prototype.collectList = function collectList<T>(this: Flux<T>): Mono<T[]> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n const values: T[] = [];\n return {\n /** Appends one value to the collected list. */\n onNext(value) {\n values.push(value);\n return false;\n },\n result: () => values\n };\n });\n};\n\nFlux.prototype.count = function count<T>(this: Flux<T>): Mono<number> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let count = 0;\n return {\n /** Counts one source value. */\n onNext() {\n count += 1;\n return false;\n },\n result: () => count\n };\n });\n};\n\nFlux.prototype.any = function any<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let matched = false;\n return {\n /** Tests one value and finishes on the first match. */\n onNext(value) {\n matched = predicate(value);\n return matched;\n },\n result: () => matched\n };\n });\n};\n\nFlux.prototype.all = function all<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let matched = true;\n return {\n /** Tests one value and finishes on the first mismatch. */\n onNext(value) {\n matched = predicate(value);\n return !matched;\n },\n result: () => matched\n };\n });\n};\n\nFlux.prototype.hasElement = function hasElement<T>(this: Flux<T>, value: T): Mono<boolean> {\n return this.any(next => Object.is(next, value));\n};\n\nFlux.prototype.next = function next<T>(this: Flux<T>): Mono<T> {\n return terminalMono<T, T>(this, 1, () => {\n let result: MaybeValue<T> = NO_VALUE;\n return {\n /** Captures the first value and finishes immediately. */\n onNext(value) {\n result = value;\n return true;\n },\n result: () => result\n };\n });\n};\n\nFlux.prototype.single = function single<T>(this: Flux<T>, defaultValue?: T): Mono<T> {\n const hasDefault = arguments.length > 0;\n return singleTerminal(this, false, hasDefault, defaultValue);\n};\n\nFlux.prototype.singleOrEmpty = function singleOrEmpty<T>(this: Flux<T>): Mono<T> {\n return singleTerminal(this, true, false);\n};\n\n/** Creates a bounded terminal Mono that validates a source has at most one value. */\nfunction singleTerminal<T>(\n source: Flux<T>,\n emptyIsAllowed: boolean,\n hasDefault = false,\n defaultValue?: T\n): Mono<T> {\n return terminalMono<T, T>(source, 2, () => {\n let seen = false;\n let value: T | undefined;\n return {\n /** Captures one value and rejects a second source value. */\n onNext(next) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n value = next;\n return false;\n },\n result: () => singleResult(seen ? value as T : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue)\n };\n });\n}\n\n/** Resolves single-value empty/default behavior. */\nfunction singleResult<T>(\n value: MaybeValue<T>,\n emptyIsAllowed: boolean,\n hasDefault: boolean,\n defaultValue: T | undefined\n): MaybeValue<T> {\n if (value !== NO_VALUE) {\n return value;\n }\n if (hasDefault) {\n return defaultValue as T;\n }\n if (emptyIsAllowed) {\n return NO_VALUE;\n }\n throw new NoSuchElementError();\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Flux } from "../flux.js";
2
+ import type { SourceFactory } from "../types.js";
3
+ /** Creates a fixed-size buffer operator that scales downstream demand upstream. */
4
+ export declare function liftBuffer<T>(source: Flux<T>, sourceFactory: SourceFactory<T[]>, size: number): Flux<T[]>;
5
+ //# sourceMappingURL=buffer-lift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer-lift.d.ts","sourceRoot":"","sources":["../../../src/publisher/operators/buffer-lift.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAEzC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAKxD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAEzG"}
@@ -0,0 +1,197 @@
1
+ import _defineProperty from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/defineProperty.js";
2
+ import { UNBOUNDED_DEMAND, addCap, multiplyCap, normalizeRequest } from "../../core/demand.js";
3
+ import { ITERATION_DEMAND_HINT, iterationDemandHint } from "../../internal/iteration-demand.js";
4
+ import { liftFlux, subscriberContext } from "./lift.js";
5
+ //#region src/publisher/operators/buffer-lift.ts
6
+ /** Creates a fixed-size buffer operator that scales downstream demand upstream. */
7
+ function liftBuffer(source, sourceFactory, size) {
8
+ return liftFlux(source, sourceFactory, (subscriber) => new BufferOperatorSubscriber(subscriber, size));
9
+ }
10
+ /** Subscriber that turns each requested buffer into `size` requested source values. */
11
+ var BufferOperatorSubscriber = class {
12
+ /** Creates a buffering subscriber for one downstream subscriber. */
13
+ constructor(actual, size) {
14
+ _defineProperty(this, "actual", void 0);
15
+ _defineProperty(this, "size", void 0);
16
+ _defineProperty(
17
+ this,
18
+ /** Values accumulated for the next downstream buffer. */
19
+ "buffer",
20
+ []
21
+ );
22
+ _defineProperty(
23
+ this,
24
+ /** Active upstream subscription. */
25
+ "upstream",
26
+ void 0
27
+ );
28
+ _defineProperty(
29
+ this,
30
+ /** Outstanding downstream buffer demand. */
31
+ "requested",
32
+ 0
33
+ );
34
+ _defineProperty(
35
+ this,
36
+ /** Guards synchronous upstream requests against reentrant downstream demand. */
37
+ "requesting",
38
+ false
39
+ );
40
+ _defineProperty(
41
+ this,
42
+ /** Source demand accumulated while an upstream request call is active. */
43
+ "missedRequested",
44
+ 0
45
+ );
46
+ _defineProperty(
47
+ this,
48
+ /** Prevents duplicate subscriptions from replacing the active upstream. */
49
+ "subscribed",
50
+ false
51
+ );
52
+ _defineProperty(
53
+ this,
54
+ /** Guards final-buffer delivery against reentrant upstream signals. */
55
+ "completing",
56
+ false
57
+ );
58
+ _defineProperty(
59
+ this,
60
+ /** Suppresses signals after cancellation or termination. */
61
+ "terminated",
62
+ false
63
+ );
64
+ this.actual = actual;
65
+ this.size = size;
66
+ }
67
+ /** Stores upstream and exposes this buffer-aware subscription downstream. */
68
+ onSubscribe(subscription) {
69
+ if (this.subscribed || this.terminated) {
70
+ cancelSilently(subscription);
71
+ return;
72
+ }
73
+ this.subscribed = true;
74
+ this.upstream = subscription;
75
+ try {
76
+ this.actual.onSubscribe(this);
77
+ } catch (error) {
78
+ this.terminated = true;
79
+ cancelSilently(subscription);
80
+ throw error;
81
+ }
82
+ }
83
+ /** Adds one source value and emits a full buffer when it reaches the configured size. */
84
+ onNext(value) {
85
+ if (this.terminated || this.completing) return;
86
+ this.buffer.push(value);
87
+ if (this.buffer.length !== this.size) return;
88
+ const next = this.buffer;
89
+ this.buffer = [];
90
+ this.producedOne();
91
+ try {
92
+ this.actual.onNext(next);
93
+ } catch (error) {
94
+ this.fail(error, true);
95
+ }
96
+ }
97
+ /** Discards the partial buffer and forwards the first source failure. */
98
+ onError(error) {
99
+ this.buffer = [];
100
+ this.fail(error, false);
101
+ }
102
+ /** Emits a final partial buffer and then completes downstream. */
103
+ onComplete() {
104
+ if (this.terminated || this.completing) return;
105
+ const finalBuffer = this.buffer;
106
+ this.buffer = [];
107
+ if (finalBuffer.length > 0) {
108
+ this.producedOne();
109
+ this.completing = true;
110
+ try {
111
+ this.actual.onNext(finalBuffer);
112
+ } catch (error) {
113
+ this.completing = false;
114
+ if (this.terminated) return;
115
+ this.terminated = true;
116
+ this.actual.onError(error);
117
+ return;
118
+ }
119
+ this.completing = false;
120
+ if (this.terminated) return;
121
+ }
122
+ this.terminated = true;
123
+ this.actual.onComplete();
124
+ }
125
+ /** Multiplies valid downstream buffer demand before requesting the source. */
126
+ request(n) {
127
+ if (this.terminated || this.completing) return;
128
+ let demand;
129
+ try {
130
+ demand = normalizeRequest(n);
131
+ } catch (error) {
132
+ this.fail(error, true);
133
+ return;
134
+ }
135
+ this.requested = addCap(this.requested, demand);
136
+ this.requestUpstream(multiplyCap(demand, this.size));
137
+ }
138
+ /** Cancels upstream and releases buffered values. */
139
+ cancel() {
140
+ if (this.terminated) return;
141
+ this.terminated = true;
142
+ this.buffer = [];
143
+ this.upstream?.cancel();
144
+ }
145
+ /** Exposes downstream context unchanged. */
146
+ currentContext() {
147
+ return subscriberContext(this.actual);
148
+ }
149
+ /** Propagates a known terminal demand batch through the buffer boundary. */
150
+ [ITERATION_DEMAND_HINT]() {
151
+ const downstream = iterationDemandHint(this.actual);
152
+ return downstream === void 0 ? void 0 : multiplyCap(downstream, this.size);
153
+ }
154
+ /** Decrements finite downstream demand after emitting one buffer. */
155
+ producedOne() {
156
+ if (this.requested !== UNBOUNDED_DEMAND && this.requested > 0) this.requested -= 1;
157
+ }
158
+ /** Requests source demand iteratively to avoid recursive synchronous request calls. */
159
+ requestUpstream(demand) {
160
+ if (this.requesting) {
161
+ this.missedRequested = addCap(this.missedRequested, demand);
162
+ return;
163
+ }
164
+ this.requesting = true;
165
+ let request = demand;
166
+ try {
167
+ while (!this.terminated) {
168
+ this.upstream?.request(request);
169
+ if (this.terminated || this.missedRequested === 0) return;
170
+ request = this.missedRequested;
171
+ this.missedRequested = 0;
172
+ }
173
+ } catch (error) {
174
+ if (!this.terminated) this.fail(error, true);
175
+ } finally {
176
+ this.requesting = false;
177
+ }
178
+ }
179
+ /** Cancels when requested and forwards one terminal failure. */
180
+ fail(error, cancelUpstream) {
181
+ if (this.terminated || this.completing) return;
182
+ this.terminated = true;
183
+ this.buffer = [];
184
+ if (cancelUpstream && this.upstream) cancelSilently(this.upstream);
185
+ this.actual.onError(error);
186
+ }
187
+ };
188
+ /** Cancels upstream without replacing the active failure or completion signal. */
189
+ function cancelSilently(subscription) {
190
+ try {
191
+ subscription.cancel();
192
+ } catch {}
193
+ }
194
+ //#endregion
195
+ export { liftBuffer };
196
+
197
+ //# sourceMappingURL=buffer-lift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer-lift.js","names":[],"sources":["../../../src/publisher/operators/buffer-lift.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Demand-aware buffering subscriber used by fixed-size Flux buffers.\n */\nimport {Context} from \"@/context/context.js\";\nimport {addCap, multiplyCap, normalizeRequest, UNBOUNDED_DEMAND} from \"@/core/demand.js\";\nimport {ITERATION_DEMAND_HINT, iterationDemandHint} from \"@/internal/iteration-demand.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {liftFlux, subscriberContext} from \"@/publisher/operators/lift.js\";\nimport type {SourceFactory} from \"@/publisher/types.js\";\nimport type {CoreSubscriber} from \"@/subscription/core-subscriber.js\";\nimport type {Subscriber} from \"@/subscription/subscriber.js\";\nimport type {Subscription} from \"@/subscription/subscription.js\";\n\n/** Creates a fixed-size buffer operator that scales downstream demand upstream. */\nexport function liftBuffer<T>(source: Flux<T>, sourceFactory: SourceFactory<T[]>, size: number): Flux<T[]> {\n return liftFlux(source, sourceFactory, subscriber => new BufferOperatorSubscriber(subscriber, size));\n}\n\n/** Subscriber that turns each requested buffer into `size` requested source values. */\nclass BufferOperatorSubscriber<T> implements CoreSubscriber<T>, Subscription {\n /** Values accumulated for the next downstream buffer. */\n private buffer: T[] = [];\n /** Active upstream subscription. */\n private upstream: Subscription | undefined;\n /** Outstanding downstream buffer demand. */\n private requested = 0;\n /** Guards synchronous upstream requests against reentrant downstream demand. */\n private requesting = false;\n /** Source demand accumulated while an upstream request call is active. */\n private missedRequested = 0;\n /** Prevents duplicate subscriptions from replacing the active upstream. */\n private subscribed = false;\n /** Guards final-buffer delivery against reentrant upstream signals. */\n private completing = false;\n /** Suppresses signals after cancellation or termination. */\n private terminated = false;\n\n /** Creates a buffering subscriber for one downstream subscriber. */\n public constructor(private readonly actual: Subscriber<T[]>, private readonly size: number) {\n }\n\n /** Stores upstream and exposes this buffer-aware subscription downstream. */\n public onSubscribe(subscription: Subscription): void {\n if (this.subscribed || this.terminated) {\n cancelSilently(subscription);\n return;\n }\n this.subscribed = true;\n this.upstream = subscription;\n try {\n this.actual.onSubscribe(this);\n } catch (error) {\n this.terminated = true;\n cancelSilently(subscription);\n throw error;\n }\n }\n\n /** Adds one source value and emits a full buffer when it reaches the configured size. */\n public onNext(value: T): void {\n if (this.terminated || this.completing) {\n return;\n }\n this.buffer.push(value);\n if (this.buffer.length !== this.size) {\n return;\n }\n const next = this.buffer;\n this.buffer = [];\n this.producedOne();\n try {\n this.actual.onNext(next);\n } catch (error) {\n this.fail(error, true);\n }\n }\n\n /** Discards the partial buffer and forwards the first source failure. */\n public onError(error: unknown): void {\n this.buffer = [];\n this.fail(error, false);\n }\n\n /** Emits a final partial buffer and then completes downstream. */\n public onComplete(): void {\n if (this.terminated || this.completing) {\n return;\n }\n const finalBuffer = this.buffer;\n this.buffer = [];\n if (finalBuffer.length > 0) {\n this.producedOne();\n this.completing = true;\n try {\n this.actual.onNext(finalBuffer);\n } catch (error) {\n this.completing = false;\n if (this.terminated) {\n return;\n }\n this.terminated = true;\n this.actual.onError(error);\n return;\n }\n this.completing = false;\n if (this.terminated) {\n return;\n }\n }\n this.terminated = true;\n this.actual.onComplete();\n }\n\n /** Multiplies valid downstream buffer demand before requesting the source. */\n public request(n: number): void {\n if (this.terminated || this.completing) {\n return;\n }\n let demand: number;\n try {\n demand = normalizeRequest(n);\n } catch (error) {\n this.fail(error, true);\n return;\n }\n this.requested = addCap(this.requested, demand);\n this.requestUpstream(multiplyCap(demand, this.size));\n }\n\n /** Cancels upstream and releases buffered values. */\n public cancel(): void {\n if (this.terminated) {\n return;\n }\n this.terminated = true;\n this.buffer = [];\n this.upstream?.cancel();\n }\n\n /** Exposes downstream context unchanged. */\n public currentContext(): Context {\n return subscriberContext(this.actual);\n }\n\n /** Propagates a known terminal demand batch through the buffer boundary. */\n public [ITERATION_DEMAND_HINT](): number | undefined {\n const downstream = iterationDemandHint(this.actual);\n return downstream === undefined ? undefined : multiplyCap(downstream, this.size);\n }\n\n /** Decrements finite downstream demand after emitting one buffer. */\n private producedOne(): void {\n if (this.requested !== UNBOUNDED_DEMAND && this.requested > 0) {\n this.requested -= 1;\n }\n }\n\n /** Requests source demand iteratively to avoid recursive synchronous request calls. */\n private requestUpstream(demand: number): void {\n if (this.requesting) {\n this.missedRequested = addCap(this.missedRequested, demand);\n return;\n }\n this.requesting = true;\n let request = demand;\n try {\n while (!this.terminated) {\n this.upstream?.request(request);\n if (this.terminated || this.missedRequested === 0) {\n return;\n }\n request = this.missedRequested;\n this.missedRequested = 0;\n }\n } catch (error) {\n if (!this.terminated) {\n this.fail(error, true);\n }\n } finally {\n this.requesting = false;\n }\n }\n\n /** Cancels when requested and forwards one terminal failure. */\n private fail(error: unknown, cancelUpstream: boolean): void {\n if (this.terminated || this.completing) {\n return;\n }\n this.terminated = true;\n this.buffer = [];\n if (cancelUpstream && this.upstream) {\n cancelSilently(this.upstream);\n }\n this.actual.onError(error);\n }\n}\n\n/** Cancels upstream without replacing the active failure or completion signal. */\nfunction cancelSilently(subscription: Subscription): void {\n try {\n subscription.cancel();\n } catch {\n // The selected terminal signal wins over cancellation failures.\n }\n}\n"],"mappings":";;;;;;AAeA,SAAgB,WAAc,QAAiB,eAAmC,MAAyB;CACvG,OAAO,SAAS,QAAQ,gBAAe,eAAc,IAAI,yBAAyB,YAAY,IAAI,CAAC;AACvG;;AAGA,IAAM,2BAAN,MAA6E;;CAmBzE,YAAmB,QAA0C,MAA+B;wBAAxD,UAAA,KAAA,CAAA;wBAA0C,QAAA,KAAA,CAAA;;;;GAjB9E;GAAsB,CAAC;;;;;GAEvB;;;;;;GAEA;GAAoB;;;;;GAEpB;GAAqB;;;;;GAErB;GAA0B;;;;;GAE1B;GAAqB;;;;;GAErB;GAAqB;;;;;GAErB;GAAqB;;EAGe,KAAA,SAAA;EAA0C,KAAA,OAAA;CAC9E;;CAGA,YAAmB,cAAkC;EACjD,IAAI,KAAK,cAAc,KAAK,YAAY;GACpC,eAAe,YAAY;GAC3B;EACJ;EACA,KAAK,aAAa;EAClB,KAAK,WAAW;EAChB,IAAI;GACA,KAAK,OAAO,YAAY,IAAI;EAChC,SAAS,OAAO;GACZ,KAAK,aAAa;GAClB,eAAe,YAAY;GAC3B,MAAM;EACV;CACJ;;CAGA,OAAc,OAAgB;EAC1B,IAAI,KAAK,cAAc,KAAK,YACxB;EAEJ,KAAK,OAAO,KAAK,KAAK;EACtB,IAAI,KAAK,OAAO,WAAW,KAAK,MAC5B;EAEJ,MAAM,OAAO,KAAK;EAClB,KAAK,SAAS,CAAC;EACf,KAAK,YAAY;EACjB,IAAI;GACA,KAAK,OAAO,OAAO,IAAI;EAC3B,SAAS,OAAO;GACZ,KAAK,KAAK,OAAO,IAAI;EACzB;CACJ;;CAGA,QAAe,OAAsB;EACjC,KAAK,SAAS,CAAC;EACf,KAAK,KAAK,OAAO,KAAK;CAC1B;;CAGA,aAA0B;EACtB,IAAI,KAAK,cAAc,KAAK,YACxB;EAEJ,MAAM,cAAc,KAAK;EACzB,KAAK,SAAS,CAAC;EACf,IAAI,YAAY,SAAS,GAAG;GACxB,KAAK,YAAY;GACjB,KAAK,aAAa;GAClB,IAAI;IACA,KAAK,OAAO,OAAO,WAAW;GAClC,SAAS,OAAO;IACZ,KAAK,aAAa;IAClB,IAAI,KAAK,YACL;IAEJ,KAAK,aAAa;IAClB,KAAK,OAAO,QAAQ,KAAK;IACzB;GACJ;GACA,KAAK,aAAa;GAClB,IAAI,KAAK,YACL;EAER;EACA,KAAK,aAAa;EAClB,KAAK,OAAO,WAAW;CAC3B;;CAGA,QAAe,GAAiB;EAC5B,IAAI,KAAK,cAAc,KAAK,YACxB;EAEJ,IAAI;EACJ,IAAI;GACA,SAAS,iBAAiB,CAAC;EAC/B,SAAS,OAAO;GACZ,KAAK,KAAK,OAAO,IAAI;GACrB;EACJ;EACA,KAAK,YAAY,OAAO,KAAK,WAAW,MAAM;EAC9C,KAAK,gBAAgB,YAAY,QAAQ,KAAK,IAAI,CAAC;CACvD;;CAGA,SAAsB;EAClB,IAAI,KAAK,YACL;EAEJ,KAAK,aAAa;EAClB,KAAK,SAAS,CAAC;EACf,KAAK,UAAU,OAAO;CAC1B;;CAGA,iBAAiC;EAC7B,OAAO,kBAAkB,KAAK,MAAM;CACxC;;CAGA,CAAQ,yBAA6C;EACjD,MAAM,aAAa,oBAAoB,KAAK,MAAM;EAClD,OAAO,eAAe,SAAY,SAAY,YAAY,YAAY,KAAK,IAAI;CACnF;;CAGA,cAA4B;EACxB,IAAI,KAAK,cAAc,oBAAoB,KAAK,YAAY,GACxD,KAAK,aAAa;CAE1B;;CAGA,gBAAwB,QAAsB;EAC1C,IAAI,KAAK,YAAY;GACjB,KAAK,kBAAkB,OAAO,KAAK,iBAAiB,MAAM;GAC1D;EACJ;EACA,KAAK,aAAa;EAClB,IAAI,UAAU;EACd,IAAI;GACA,OAAO,CAAC,KAAK,YAAY;IACrB,KAAK,UAAU,QAAQ,OAAO;IAC9B,IAAI,KAAK,cAAc,KAAK,oBAAoB,GAC5C;IAEJ,UAAU,KAAK;IACf,KAAK,kBAAkB;GAC3B;EACJ,SAAS,OAAO;GACZ,IAAI,CAAC,KAAK,YACN,KAAK,KAAK,OAAO,IAAI;EAE7B,UAAU;GACN,KAAK,aAAa;EACtB;CACJ;;CAGA,KAAa,OAAgB,gBAA+B;EACxD,IAAI,KAAK,cAAc,KAAK,YACxB;EAEJ,KAAK,aAAa;EAClB,KAAK,SAAS,CAAC;EACf,IAAI,kBAAkB,KAAK,UACvB,eAAe,KAAK,QAAQ;EAEhC,KAAK,OAAO,QAAQ,KAAK;CAC7B;AACJ;;AAGA,SAAS,eAAe,cAAkC;CACtD,IAAI;EACA,aAAa,OAAO;CACxB,QAAQ,CAER;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../../../src/publisher/operators/compat/flux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../../../src/publisher/operators/compat/flux.ts"],"names":[],"mappings":"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"}