@naturalcycles/datastore-lib 4.15.0 → 4.15.1

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.
@@ -225,7 +225,7 @@ export class DatastoreDB extends BaseCommonDB {
225
225
  (opt.experimentalCursorStream
226
226
  ? new DatastoreStreamReadable(q, opt)
227
227
  : ds.runQueryStream(q, this.getRunQueryOptions(opt)))
228
- .on('error', err => transform.emit('error', err))
228
+ .on('error', err => transform.destroy(err))
229
229
  .pipe(transform);
230
230
  });
231
231
  return transform;
@@ -91,7 +91,7 @@ export class DatastoreStreamReadable extends Readable {
91
91
  }
92
92
  void this.runNextQuery().catch(err => {
93
93
  this.logger.error('error in runNextQuery', err);
94
- this.emit('error', err);
94
+ this.destroy(err);
95
95
  });
96
96
  }
97
97
  async runNextQuery() {
@@ -162,6 +162,7 @@ export class DatastoreStreamReadable extends Readable {
162
162
  return await q.run(this.dsOpt);
163
163
  }, {
164
164
  name: `DatastoreStreamReadable.query(${table})`,
165
+ predicate: err => RETRY_ON.some(s => err?.message?.toLowerCase()?.includes(s)),
165
166
  maxAttempts: 5,
166
167
  delay: 5000,
167
168
  delayMultiplier: 2,
@@ -174,9 +175,21 @@ export class DatastoreStreamReadable extends Readable {
174
175
  table,
175
176
  rowsRetrieved: this.rowsRetrieved,
176
177
  }, err);
177
- this.emit('error', err);
178
178
  clearInterval(this.maxWaitInterval);
179
+ this.destroy(err);
179
180
  return;
180
181
  }
181
182
  }
182
183
  }
184
+ // Examples of errors:
185
+ // UNKNOWN: Stream removed
186
+ const RETRY_ON = [
187
+ 'GOAWAY',
188
+ 'UNAVAILABLE',
189
+ 'UNKNOWN',
190
+ 'DEADLINE_EXCEEDED',
191
+ 'ABORTED',
192
+ 'much contention',
193
+ 'try again',
194
+ 'timeout',
195
+ ].map(s => s.toLowerCase());
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/datastore-lib",
3
3
  "type": "module",
4
- "version": "4.15.0",
4
+ "version": "4.15.1",
5
5
  "description": "Opinionated library to work with Google Datastore, implements CommonDB",
6
6
  "dependencies": {
7
7
  "@google-cloud/datastore": "^10",
@@ -352,7 +352,7 @@ export class DatastoreDB extends BaseCommonDB implements CommonDB {
352
352
  ? new DatastoreStreamReadable<ROW>(q, opt)
353
353
  : (ds.runQueryStream(q, this.getRunQueryOptions(opt)) as ReadableTyped<ROW>)
354
354
  )
355
- .on('error', err => transform.emit('error', err))
355
+ .on('error', err => transform.destroy(err))
356
356
  .pipe(transform)
357
357
  })
358
358
 
@@ -125,7 +125,7 @@ export class DatastoreStreamReadable<T = any> extends Readable implements Readab
125
125
 
126
126
  void this.runNextQuery().catch(err => {
127
127
  this.logger.error('error in runNextQuery', err)
128
- this.emit('error', err)
128
+ this.destroy(err)
129
129
  })
130
130
  }
131
131
 
@@ -217,6 +217,7 @@ export class DatastoreStreamReadable<T = any> extends Readable implements Readab
217
217
  },
218
218
  {
219
219
  name: `DatastoreStreamReadable.query(${table})`,
220
+ predicate: err => RETRY_ON.some(s => err?.message?.toLowerCase()?.includes(s)),
220
221
  maxAttempts: 5,
221
222
  delay: 5000,
222
223
  delayMultiplier: 2,
@@ -233,9 +234,22 @@ export class DatastoreStreamReadable<T = any> extends Readable implements Readab
233
234
  },
234
235
  err,
235
236
  )
236
- this.emit('error', err)
237
237
  clearInterval(this.maxWaitInterval)
238
+ this.destroy(err as Error)
238
239
  return
239
240
  }
240
241
  }
241
242
  }
243
+
244
+ // Examples of errors:
245
+ // UNKNOWN: Stream removed
246
+ const RETRY_ON = [
247
+ 'GOAWAY',
248
+ 'UNAVAILABLE',
249
+ 'UNKNOWN',
250
+ 'DEADLINE_EXCEEDED',
251
+ 'ABORTED',
252
+ 'much contention',
253
+ 'try again',
254
+ 'timeout',
255
+ ].map(s => s.toLowerCase())