@sapphire/event-iterator 1.3.0-next.a3e5cf0b.0 → 1.3.0-next.a4e5a567.0

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.
package/dist/index.js CHANGED
@@ -139,12 +139,13 @@ class EventIterator {
139
139
  * The next value that's received from the EventEmitter.
140
140
  */
141
141
  async next() {
142
+ var _a;
142
143
  // If there are elements in the queue, return an undone response:
143
144
  if (__classPrivateFieldGet(this, _EventIterator_queue).length) {
144
145
  const value = __classPrivateFieldGet(this, _EventIterator_queue).shift();
145
146
  if (!this.filter(value))
146
147
  return this.next();
147
- if (__classPrivateFieldSet(this, _EventIterator_passed, +__classPrivateFieldGet(this, _EventIterator_passed) + 1) >= __classPrivateFieldGet(this, _EventIterator_limit))
148
+ if (__classPrivateFieldSet(this, _EventIterator_passed, (_a = __classPrivateFieldGet(this, _EventIterator_passed), ++_a)) >= __classPrivateFieldGet(this, _EventIterator_limit))
148
149
  this.end();
149
150
  if (__classPrivateFieldGet(this, _EventIterator_idleTimer))
150
151
  __classPrivateFieldGet(this, _EventIterator_idleTimer).refresh();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -135,12 +135,13 @@ class EventIterator {
135
135
  * The next value that's received from the EventEmitter.
136
136
  */
137
137
  async next() {
138
+ var _a;
138
139
  // If there are elements in the queue, return an undone response:
139
140
  if (__classPrivateFieldGet(this, _EventIterator_queue).length) {
140
141
  const value = __classPrivateFieldGet(this, _EventIterator_queue).shift();
141
142
  if (!this.filter(value))
142
143
  return this.next();
143
- if (__classPrivateFieldSet(this, _EventIterator_passed, +__classPrivateFieldGet(this, _EventIterator_passed) + 1) >= __classPrivateFieldGet(this, _EventIterator_limit))
144
+ if (__classPrivateFieldSet(this, _EventIterator_passed, (_a = __classPrivateFieldGet(this, _EventIterator_passed), ++_a)) >= __classPrivateFieldGet(this, _EventIterator_limit))
144
145
  this.end();
145
146
  if (__classPrivateFieldGet(this, _EventIterator_idleTimer))
146
147
  __classPrivateFieldGet(this, _EventIterator_idleTimer).refresh();
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -141,12 +141,13 @@
141
141
  * The next value that's received from the EventEmitter.
142
142
  */
143
143
  async next() {
144
+ var _a;
144
145
  // If there are elements in the queue, return an undone response:
145
146
  if (__classPrivateFieldGet(this, _EventIterator_queue).length) {
146
147
  const value = __classPrivateFieldGet(this, _EventIterator_queue).shift();
147
148
  if (!this.filter(value))
148
149
  return this.next();
149
- if (__classPrivateFieldSet(this, _EventIterator_passed, +__classPrivateFieldGet(this, _EventIterator_passed) + 1) >= __classPrivateFieldGet(this, _EventIterator_limit))
150
+ if (__classPrivateFieldSet(this, _EventIterator_passed, (_a = __classPrivateFieldGet(this, _EventIterator_passed), ++_a)) >= __classPrivateFieldGet(this, _EventIterator_limit))
150
151
  this.end();
151
152
  if (__classPrivateFieldGet(this, _EventIterator_idleTimer))
152
153
  __classPrivateFieldGet(this, _EventIterator_idleTimer).refresh();
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/explicit-member-accessibility */\nimport type { EventEmitter } from 'events';\n\n/**\n * A filter for an EventIterator.\n */\nexport type EventIteratorFilter<V> = (value: V) => boolean;\n\n/**\n * Options to be passed to an EventIterator.\n */\nexport interface EventIteratorOptions<V> {\n\t/**\n\t * The filter.\n\t */\n\tfilter?: EventIteratorFilter<V>;\n\n\t/**\n\t * The timeout in ms before ending the EventIterator.\n\t */\n\tidle?: number;\n\n\t/**\n\t * The limit of events that pass the filter to iterate.\n\t */\n\tlimit?: number;\n}\n\n/**\n * An EventIterator, used for asynchronously iterating over received values.\n */\nexport class EventIterator<V extends unknown[]> implements AsyncIterableIterator<V> {\n\t/**\n\t * The emitter to listen to.\n\t */\n\tpublic readonly emitter: EventEmitter;\n\n\t/**\n\t * The event the event iterator is listening for to receive values from.\n\t */\n\tpublic readonly event: string;\n\n\t/**\n\t * The filter used to filter out values.\n\t */\n\tpublic filter: EventIteratorFilter<V>;\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\t#ended = false;\n\n\t/**\n\t * The amount of idle time in ms before moving on.\n\t */\n\t#idle?: number;\n\n\t/**\n\t * The queue of received values.\n\t */\n\t#queue: V[] = [];\n\n\t/**\n\t * The amount of events that have passed the filter.\n\t */\n\t#passed = 0;\n\n\t/**\n\t * The limit before ending the EventIterator.\n\t */\n\t#limit: number;\n\n\t/**\n\t * The timer to track when this will idle out.\n\t */\n\t#idleTimer: NodeJS.Timer | null = null;\n\n\t/**\n\t * The push handler with context bound to the instance.\n\t */\n\t#push: (this: EventIterator<V>, ...value: V) => void;\n\n\t/**\n\t * @param emitter The event emitter to listen to.\n\t * @param event The event we're listening for to receives values from.\n\t * @param limit The amount of values to receive before ending the iterator.\n\t * @param options Any extra options.\n\t */\n\tpublic constructor(emitter: EventEmitter, event: string, options: EventIteratorOptions<V> = {}) {\n\t\tthis.emitter = emitter;\n\t\tthis.event = event;\n\t\tthis.#limit = options.limit ?? Infinity;\n\t\tthis.#idle = options.idle;\n\t\tthis.filter = options.filter ?? ((): boolean => true);\n\n\t\t// This timer is to idle out on lack of valid responses\n\t\tif (this.#idle) this.#idleTimer = setTimeout(this.end.bind(this), this.#idle);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.#push = this.push.bind(this);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners + 1);\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.on(this.event, this.#push);\n\t}\n\n\t/**\n\t * Whether or not the EventIterator has ended.\n\t */\n\tpublic get ended(): boolean {\n\t\treturn this.#ended;\n\t}\n\n\t/**\n\t * Ends the EventIterator.\n\t */\n\tpublic end(): void {\n\t\tif (this.#ended) return;\n\t\tthis.#ended = true;\n\t\tthis.#queue = [];\n\n\t\t// @ts-expect-error Silence weird compiler issue regarding `this.push`'s arguments not being `any`.\n\t\tthis.emitter.off(this.event, this.#push);\n\t\tconst maxListeners = this.emitter.getMaxListeners();\n\t\tif (maxListeners !== 0) this.emitter.setMaxListeners(maxListeners - 1);\n\t}\n\n\t/**\n\t * The next value that's received from the EventEmitter.\n\t */\n\tpublic async next(): Promise<IteratorResult<V>> {\n\t\t// If there are elements in the queue, return an undone response:\n\t\tif (this.#queue.length) {\n\t\t\tconst value = this.#queue.shift()!;\n\t\t\tif (!this.filter(value)) return this.next();\n\t\t\tif (++this.#passed >= this.#limit) this.end();\n\t\t\tif (this.#idleTimer) this.#idleTimer.refresh();\n\t\t\treturn { done: false, value };\n\t\t}\n\n\t\t// If the iterator ended, clean-up timer and return a done response:\n\t\tif (this.#ended) {\n\t\t\tif (this.#idleTimer) clearTimeout(this.#idleTimer);\n\t\t\treturn { done: true, value: undefined as never };\n\t\t}\n\n\t\t// Listen for a new element from the emitter:\n\t\treturn new Promise<IteratorResult<V>>((resolve) => {\n\t\t\tlet idleTimer: NodeJS.Timer | null = null;\n\n\t\t\t// If there is an idle time set, we will create a temporary timer,\n\t\t\t// which will cause the iterator to end if no new elements are received:\n\t\t\tif (this.#idle) {\n\t\t\t\tidleTimer = setTimeout(() => {\n\t\t\t\t\tthis.end();\n\t\t\t\t\tresolve(this.next());\n\t\t\t\t}, this.#idle);\n\t\t\t}\n\n\t\t\t// Once it has received at least one value, we will clear the timer (if defined),\n\t\t\t// and resolve with the new value:\n\t\t\tthis.emitter.once(this.event, () => {\n\t\t\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\t\t\tresolve(this.next());\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles what happens when you break or return from a loop.\n\t */\n\tpublic return(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * Handles what happens when you encounter an error in a loop.\n\t */\n\tpublic throw(): Promise<IteratorResult<V>> {\n\t\tthis.end();\n\t\treturn Promise.resolve({ done: true, value: undefined as never });\n\t}\n\n\t/**\n\t * The symbol allowing EventIterators to be used in for-await-of loops.\n\t */\n\tpublic [Symbol.asyncIterator](): AsyncIterableIterator<V> {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pushes a value into the queue.\n\t */\n\tprotected push(...value: V): void {\n\t\tthis.#queue.push(value);\n\t}\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/event-iterator",
3
- "version": "1.3.0-next.a3e5cf0b.0",
3
+ "version": "1.3.0-next.a4e5a567.0",
4
4
  "description": "Turns event emitter events into async iterators.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -51,5 +51,5 @@
51
51
  "publishConfig": {
52
52
  "access": "public"
53
53
  },
54
- "gitHead": "a3e5cf0bbe28eb36e46274bfe54a5f9c8ebe2703"
54
+ "gitHead": "a4e5a567a4d75dbba57df6774664ebaff55c24f4"
55
55
  }