@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.
- package/deepstream.js +77 -64
- 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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const change = JSON.parse(line)
|
|
203
|
+
const batch = batched ? [] : null
|
|
204
|
+
while (true) {
|
|
205
|
+
const line = src.read()
|
|
202
206
|
|
|
203
|
-
|
|
207
|
+
if (line === '') {
|
|
208
|
+
continue
|
|
209
|
+
} else if (line !== null) {
|
|
210
|
+
const change = JSON.parse(line)
|
|
204
211
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
229
|
+
await new Promise((resolve) => {
|
|
230
|
+
resume = resolve
|
|
231
|
+
})
|
|
212
232
|
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
|
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
|
|