@nxtedition/lib 15.0.46 → 15.0.47

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 (2) hide show
  1. package/deepstream.js +77 -64
  2. package/package.json +1 -1
package/deepstream.js CHANGED
@@ -147,6 +147,7 @@ async function* changes(
147
147
  includeDocs = false,
148
148
  highWaterMark = 256 * 1024,
149
149
  heartbeat = 60e3,
150
+ signal,
150
151
  retry,
151
152
  },
152
153
  ) {
@@ -158,81 +159,93 @@ async function* changes(
158
159
  url.searchParams.set('live', String(live))
159
160
  url.searchParams.set('include_docs', String(includeDocs))
160
161
 
161
- for (let retryCount = 0; retryCount < retry; retryCount++) {
162
- const ac = new AbortController()
163
- const signal = ac.signal
164
- try {
165
- // TODO (fix): Use nxt-undici
166
- const res = await undici.request(url, {
167
- idempotent: false,
168
- blocking: true,
169
- method: 'GET',
170
- signal,
171
- throwOnError: true,
172
- highWaterMark,
173
- bodyTimeout: 2 * heartbeat,
174
- })
175
-
176
- const src = stream.pipeline(res.body, split2(), () => {})
177
-
178
- let error
179
- let ended = false
180
- let resume = () => {}
181
-
182
- src
183
- .on('error', (err) => {
184
- error = err
185
- })
186
- .on('readable', () => {
187
- resume()
188
- })
189
- .on('end', () => {
190
- ended = true
191
- resume()
162
+ let ac
163
+
164
+ const abort = () => {
165
+ ac?.abort(signal.reason)
166
+ }
167
+
168
+ signal?.addEventListener('abort', abort)
169
+
170
+ try {
171
+ for (let retryCount = 0; retryCount < retry; retryCount++) {
172
+ ac = new AbortController()
173
+ try {
174
+ // TODO (fix): Use nxt-undici
175
+ const res = await undici.request(url, {
176
+ idempotent: false,
177
+ blocking: true,
178
+ method: 'GET',
179
+ signal: ac.signal,
180
+ throwOnError: true,
181
+ highWaterMark,
182
+ bodyTimeout: 2 * heartbeat,
192
183
  })
193
184
 
194
- const batch = batched ? [] : null
195
- while (true) {
196
- const line = src.read()
185
+ const src = stream.pipeline(res.body, split2(), () => {})
186
+
187
+ let error
188
+ let ended = false
189
+ let resume = () => {}
190
+
191
+ src
192
+ .on('error', (err) => {
193
+ error = err
194
+ })
195
+ .on('readable', () => {
196
+ resume()
197
+ })
198
+ .on('end', () => {
199
+ ended = true
200
+ resume()
201
+ })
197
202
 
198
- if (line === '') {
199
- continue
200
- } else if (line !== null) {
201
- const change = JSON.parse(line)
203
+ const batch = batched ? [] : null
204
+ while (true) {
205
+ const line = src.read()
202
206
 
203
- retryCount = 0
207
+ if (line === '') {
208
+ continue
209
+ } else if (line !== null) {
210
+ const change = JSON.parse(line)
204
211
 
205
- if (change.seq) {
206
- since = change.seq
207
- }
208
- if (batch) {
209
- batch.push(change)
212
+ retryCount = 0
213
+
214
+ if (change.seq) {
215
+ since = change.seq
216
+ }
217
+ if (batch) {
218
+ batch.push(change)
219
+ } else {
220
+ yield change
221
+ }
222
+ } else if (batch?.length) {
223
+ yield batch.splice(0)
224
+ } else if (error) {
225
+ throw error
226
+ } else if (ended) {
227
+ return
210
228
  } else {
211
- yield change
229
+ await new Promise((resolve) => {
230
+ resume = resolve
231
+ })
212
232
  }
213
- } else if (batch?.length) {
214
- yield batch.splice(0)
215
- } else if (error) {
216
- throw error
217
- } else if (ended) {
218
- return
233
+ }
234
+ } catch (err) {
235
+ if (typeof retry === 'function') {
236
+ const retryState = { since }
237
+ await retry(err, retryCount, retryState, { signal: ac.signal })
238
+ url.searchParams.set('since', since || '0')
219
239
  } else {
220
- await new Promise((resolve) => {
221
- resume = resolve
222
- })
240
+ await delay(err, retryCount, { signal: ac.signal })
223
241
  }
242
+ } finally {
243
+ ac.abort()
244
+ ac = null
224
245
  }
225
- } catch (err) {
226
- if (typeof retry === 'function') {
227
- const retryState = { since }
228
- await retry(err, retryCount, retryState, { signal })
229
- url.searchParams.set('since', since || '0')
230
- } else {
231
- await delay(err, retryCount, { signal })
232
- }
233
- } finally {
234
- ac.abort()
235
246
  }
247
+ } finally {
248
+ signal?.removeEventListener('abort', abort)
236
249
  }
237
250
  }
238
251
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "15.0.46",
3
+ "version": "15.0.47",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "files": [