sqlite-executor 4.0.4 → 4.0.5

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.
@@ -16,6 +16,8 @@ export interface PipelineEngineOptions {
16
16
  maxInflight?: number;
17
17
  /** 任务超时时的回调 */
18
18
  onTaskTimeout?: (task: any) => void;
19
+ /** 任务超时检查的时间间隔,默认 100ms */
20
+ sweepInterval?: number;
19
21
  }
20
22
 
21
23
  /**
@@ -287,10 +287,11 @@ function createJsonValueParser(onValue) {
287
287
  }
288
288
  if (consumeUntil > 0) {
289
289
  this._consumed = consumeUntil;
290
- this.readPos = this._consumed;
290
+ this.readPos = -1 !== this.start ? this.buffer.length : this._consumed;
291
291
  if (this._consumed > 65536) {
292
+ if (-1 !== this.start) this.start -= this._consumed;
292
293
  this.buffer = this.buffer.slice(this._consumed);
293
- this.readPos = 0;
294
+ this.readPos = this.buffer.length;
294
295
  this._consumed = 0;
295
296
  }
296
297
  } else this.readPos = this.buffer.length;
@@ -1293,10 +1294,11 @@ function classifySingle(stmt) {
1293
1294
  return READ_ONLY_KINDS.has(kind) ? "read" : "write";
1294
1295
  }
1295
1296
  function classifySQL(sql) {
1296
- if ("string" != typeof sql || 0 === sql.trim().length) return "write";
1297
+ if ("string" != typeof sql) return "write";
1297
1298
  var cached = _classifyCache.get(sql);
1298
1299
  if (void 0 !== cached) return cached;
1299
1300
  var trimmed = sql.trim();
1301
+ if (0 === trimmed.length) return "write";
1300
1302
  var result;
1301
1303
  if (trimmed.includes(";")) {
1302
1304
  var stmts = trimmed.split(";");
@@ -1720,7 +1722,7 @@ function buildPayload(sql, token) {
1720
1722
  return "".concat(normalized).concat(suffix, "\nSELECT '").concat(token, "' AS ").concat(TOKEN_COLUMN, ";\n");
1721
1723
  }
1722
1724
  function isTransactionControl(sql) {
1723
- var s = sql.trim().toUpperCase();
1725
+ var s = sql.toUpperCase();
1724
1726
  return "BEGIN" === s || "BEGIN TRANSACTION" === s || "COMMIT" === s || "COMMIT TRANSACTION" === s || "ROLLBACK" === s || "ROLLBACK TRANSACTION" === s || s.startsWith("BEGIN ") || s.startsWith("COMMIT ") || s.startsWith("ROLLBACK ");
1725
1727
  }
1726
1728
  function buildBatchPayload(batch) {
@@ -1787,8 +1789,9 @@ function buildBatchPayload(batch) {
1787
1789
  }
1788
1790
  return parts1.join("");
1789
1791
  }
1792
+ var TC_FIRST_CHAR = TOKEN_COLUMN.charCodeAt(0);
1790
1793
  function isSentinelRaw(raw, token) {
1791
- return raw === '[{"'.concat(TOKEN_COLUMN, '":"').concat(token, '"}]');
1794
+ return raw.charCodeAt(3) === TC_FIRST_CHAR && raw === '[{"'.concat(TOKEN_COLUMN, '":"').concat(token, '"}]');
1792
1795
  }
1793
1796
  function isSentinelRow(value, token) {
1794
1797
  var _value_;
@@ -1854,7 +1857,6 @@ function settleTask(task, error, value, metrics) {
1854
1857
  var _ref = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : {}, _ref_resetRowParser = _ref.resetRowParser, resetRowParser = void 0 === _ref_resetRowParser ? false : _ref_resetRowParser;
1855
1858
  if (task.settled) return;
1856
1859
  task.settled = true;
1857
- clearTimeout(task.timer);
1858
1860
  if (resetRowParser) {
1859
1861
  var _task_rowParser_reset, _task_rowParser;
1860
1862
  null == (_task_rowParser = task.rowParser) || null == (_task_rowParser_reset = _task_rowParser.reset) || _task_rowParser_reset.call(_task_rowParser);
@@ -1903,8 +1905,6 @@ function finalizePendingTasks(tasks, settle, pumpQueue) {
1903
1905
  function prepareTaskTimeout(task, metrics) {
1904
1906
  if (task.settled) return null;
1905
1907
  task.timedout = true;
1906
- clearTimeout(task.timer);
1907
- task.timer = null;
1908
1908
  null == metrics || metrics.incrementTasksTimeout();
1909
1909
  return createTimeoutError(task.timeout, task.sql);
1910
1910
  }
@@ -3033,16 +3033,17 @@ function pipelineEngine_unsupported_iterable_to_array(o, minLen) {
3033
3033
  if ("Map" === n || "Set" === n) return Array.from(n);
3034
3034
  if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return pipelineEngine_array_like_to_array(o, minLen);
3035
3035
  }
3036
- var _queue = /*#__PURE__*/ new WeakMap(), pipelineEngine_inflightTasks = /*#__PURE__*/ new WeakMap(), pipelineEngine_pendingFinalizeTasks = /*#__PURE__*/ new WeakMap(), pipelineEngine_scheduledFinalize = /*#__PURE__*/ new WeakMap(), _sharedValueParser = /*#__PURE__*/ new WeakMap(), pipelineEngine_processManager = /*#__PURE__*/ new WeakMap(), pipelineEngine_metrics = /*#__PURE__*/ new WeakMap(), pipelineEngine_statementTimeout = /*#__PURE__*/ new WeakMap(), pipelineEngine_logger = /*#__PURE__*/ new WeakMap(), pipelineEngine_batchSize = /*#__PURE__*/ new WeakMap(), pipelineEngine_maxInflight = /*#__PURE__*/ new WeakMap(), _onTaskTimeout = /*#__PURE__*/ new WeakMap(), _active = /*#__PURE__*/ new WeakMap(), core_pipelineEngine_pumpQueue = /*#__PURE__*/ new WeakSet(), pipelineEngine_handleParsedValue = /*#__PURE__*/ new WeakSet(), core_pipelineEngine_scheduleFinalizeCheck = /*#__PURE__*/ new WeakSet(), core_pipelineEngine_handleTaskTimeout = /*#__PURE__*/ new WeakSet(), pipelineEngine_settleTask = /*#__PURE__*/ new WeakSet();
3036
+ var _queue = /*#__PURE__*/ new WeakMap(), pipelineEngine_inflightTasks = /*#__PURE__*/ new WeakMap(), pipelineEngine_pendingFinalizeTasks = /*#__PURE__*/ new WeakMap(), pipelineEngine_scheduledFinalize = /*#__PURE__*/ new WeakMap(), _sharedValueParser = /*#__PURE__*/ new WeakMap(), pipelineEngine_processManager = /*#__PURE__*/ new WeakMap(), pipelineEngine_metrics = /*#__PURE__*/ new WeakMap(), pipelineEngine_statementTimeout = /*#__PURE__*/ new WeakMap(), pipelineEngine_logger = /*#__PURE__*/ new WeakMap(), pipelineEngine_batchSize = /*#__PURE__*/ new WeakMap(), pipelineEngine_maxInflight = /*#__PURE__*/ new WeakMap(), _onTaskTimeout = /*#__PURE__*/ new WeakMap(), _active = /*#__PURE__*/ new WeakMap(), _sweepTimer = /*#__PURE__*/ new WeakMap(), _sweepIntervalMs = /*#__PURE__*/ new WeakMap(), core_pipelineEngine_pumpQueue = /*#__PURE__*/ new WeakSet(), pipelineEngine_handleParsedValue = /*#__PURE__*/ new WeakSet(), core_pipelineEngine_scheduleFinalizeCheck = /*#__PURE__*/ new WeakSet(), _scheduleSweep = /*#__PURE__*/ new WeakSet(), core_pipelineEngine_handleTaskTimeout = /*#__PURE__*/ new WeakSet(), pipelineEngine_settleTask = /*#__PURE__*/ new WeakSet();
3037
3037
  var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3038
3038
  "use strict";
3039
3039
  function PipelineEngine(processManager, param) {
3040
3040
  var _this = this;
3041
- var metrics = param.metrics, statementTimeout = param.statementTimeout, logger = param.logger, _param_batchSize = param.batchSize, batchSize = void 0 === _param_batchSize ? DEFAULT_BATCH_SIZE : _param_batchSize, _param_maxInflight = param.maxInflight, maxInflight = void 0 === _param_maxInflight ? DEFAULT_MAX_INFLIGHT : _param_maxInflight, onTaskTimeout = param.onTaskTimeout;
3041
+ var metrics = param.metrics, statementTimeout = param.statementTimeout, logger = param.logger, _param_batchSize = param.batchSize, batchSize = void 0 === _param_batchSize ? DEFAULT_BATCH_SIZE : _param_batchSize, _param_maxInflight = param.maxInflight, maxInflight = void 0 === _param_maxInflight ? DEFAULT_MAX_INFLIGHT : _param_maxInflight, onTaskTimeout = param.onTaskTimeout, _param_sweepInterval = param.sweepInterval, sweepInterval = void 0 === _param_sweepInterval ? 100 : _param_sweepInterval;
3042
3042
  pipelineEngine_class_call_check(this, PipelineEngine);
3043
3043
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_pumpQueue);
3044
3044
  pipelineEngine_class_private_method_init(this, pipelineEngine_handleParsedValue);
3045
3045
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_scheduleFinalizeCheck);
3046
+ pipelineEngine_class_private_method_init(this, _scheduleSweep);
3046
3047
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_handleTaskTimeout);
3047
3048
  pipelineEngine_class_private_method_init(this, pipelineEngine_settleTask);
3048
3049
  pipelineEngine_class_private_field_init(this, _queue, {
@@ -3097,6 +3098,14 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3097
3098
  writable: true,
3098
3099
  value: false
3099
3100
  });
3101
+ pipelineEngine_class_private_field_init(this, _sweepTimer, {
3102
+ writable: true,
3103
+ value: null
3104
+ });
3105
+ pipelineEngine_class_private_field_init(this, _sweepIntervalMs, {
3106
+ writable: true,
3107
+ value: void 0
3108
+ });
3100
3109
  pipelineEngine_class_private_field_set(this, pipelineEngine_processManager, processManager);
3101
3110
  pipelineEngine_class_private_field_set(this, pipelineEngine_metrics, metrics);
3102
3111
  pipelineEngine_class_private_field_set(this, pipelineEngine_statementTimeout, statementTimeout);
@@ -3110,8 +3119,15 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3110
3119
  pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).setOnDrainCallback(function() {
3111
3120
  return pipelineEngine_class_private_method_get(_this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(_this);
3112
3121
  });
3122
+ pipelineEngine_class_private_field_set(this, _sweepIntervalMs, sweepInterval);
3113
3123
  }
3114
3124
  pipelineEngine_create_class(PipelineEngine, [
3125
+ {
3126
+ key: "_sweepTimer",
3127
+ get: function() {
3128
+ return pipelineEngine_class_private_field_get(this, _sweepTimer);
3129
+ }
3130
+ },
3115
3131
  {
3116
3132
  key: "mainQueue",
3117
3133
  get: function() {
@@ -3162,7 +3178,7 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3162
3178
  value: function(chunk) {
3163
3179
  var task = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)[0];
3164
3180
  if (!task) return;
3165
- if ("stream" === task.kind && task.rowParser && !task.rowParser.finished) {
3181
+ if ("stream" === task.kind && task.rowParser && !task.rowParser.finished && !task.timedout) {
3166
3182
  var leftover = task.rowParser.feed(chunk);
3167
3183
  if (leftover) pipelineEngine_class_private_field_get(this, _sharedValueParser).feed(leftover);
3168
3184
  return;
@@ -3186,6 +3202,7 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3186
3202
  {
3187
3203
  key: "rejectAll",
3188
3204
  value: function(error) {
3205
+ pipelineEngine_class_private_field_get(this, _sharedValueParser).reset();
3189
3206
  var all = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks);
3190
3207
  pipelineEngine_class_private_field_set(this, pipelineEngine_inflightTasks, []);
3191
3208
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
@@ -3232,6 +3249,8 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3232
3249
  key: "kill",
3233
3250
  value: function() {
3234
3251
  pipelineEngine_class_private_field_set(this, _active, false);
3252
+ clearTimeout(pipelineEngine_class_private_field_get(this, _sweepTimer));
3253
+ pipelineEngine_class_private_field_set(this, _sweepTimer, null);
3235
3254
  this.rejectAll(new Error("PipelineEngine is killed"));
3236
3255
  }
3237
3256
  }
@@ -3239,7 +3258,6 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3239
3258
  return PipelineEngine;
3240
3259
  }();
3241
3260
  function pipelineEngine_pumpQueue() {
3242
- var _this = this;
3243
3261
  var _$_class_private_field_get;
3244
3262
  if (!pipelineEngine_class_private_field_get(this, _active)) return;
3245
3263
  if (pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).draining) return;
@@ -3256,14 +3274,10 @@ function pipelineEngine_pumpQueue() {
3256
3274
  var payload = buildBatchPayload(batch);
3257
3275
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
3258
3276
  try {
3259
- var _loop = function() {
3260
- var task = _step.value;
3261
- task.startTime = now;
3262
- task.timer = setTimeout(function() {
3263
- return pipelineEngine_class_private_method_get(_this, core_pipelineEngine_handleTaskTimeout, pipelineEngine_handleTaskTimeout).call(_this, task);
3264
- }, task.timeout);
3265
- };
3266
- for(var _iterator = batch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
3277
+ for(var _iterator = batch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
3278
+ var task1 = _step.value;
3279
+ task1.startTime = now;
3280
+ }
3267
3281
  } catch (err) {
3268
3282
  _didIteratorError = true;
3269
3283
  _iteratorError = err;
@@ -3275,13 +3289,13 @@ function pipelineEngine_pumpQueue() {
3275
3289
  }
3276
3290
  }
3277
3291
  (_$_class_private_field_get = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)).push.apply(_$_class_private_field_get, pipelineEngine_to_consumable_array(batch));
3292
+ pipelineEngine_class_private_method_get(this, _scheduleSweep, scheduleSweep).call(this);
3278
3293
  pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).write(payload);
3279
3294
  }
3280
3295
  function core_pipelineEngine_handleParsedValue(raw) {
3281
3296
  var task = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)[0];
3282
3297
  if (!task) return;
3283
3298
  if (isSentinelRaw(raw, task.token)) {
3284
- clearTimeout(task.timer);
3285
3299
  pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks).shift();
3286
3300
  if (task.timedout) return void pipelineEngine_class_private_method_get(this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(this);
3287
3301
  if (task.consumerError) {
@@ -3303,7 +3317,6 @@ function core_pipelineEngine_handleParsedValue(raw) {
3303
3317
  return;
3304
3318
  }
3305
3319
  if (isSentinelRow(parsed, task.token)) {
3306
- clearTimeout(task.timer);
3307
3320
  pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks).shift();
3308
3321
  if (task.timedout) return void pipelineEngine_class_private_method_get(this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(this);
3309
3322
  if (task.consumerError) {
@@ -3333,6 +3346,20 @@ function pipelineEngine_scheduleFinalizeCheck() {
3333
3346
  });
3334
3347
  });
3335
3348
  }
3349
+ function scheduleSweep() {
3350
+ var _this = this;
3351
+ if (pipelineEngine_class_private_field_get(this, _sweepTimer)) return;
3352
+ pipelineEngine_class_private_field_set(this, _sweepTimer, setTimeout(function() {
3353
+ pipelineEngine_class_private_field_set(_this, _sweepTimer, null);
3354
+ var inflight = pipelineEngine_class_private_field_get(_this, pipelineEngine_inflightTasks);
3355
+ var now = performance.now();
3356
+ for(var i = 0; i < inflight.length; i++){
3357
+ var task = inflight[i];
3358
+ if (now - task.startTime > task.timeout) pipelineEngine_class_private_method_get(_this, core_pipelineEngine_handleTaskTimeout, pipelineEngine_handleTaskTimeout).call(_this, task);
3359
+ }
3360
+ if (pipelineEngine_class_private_field_get(_this, pipelineEngine_inflightTasks).length > 0) pipelineEngine_class_private_method_get(_this, _scheduleSweep, scheduleSweep).call(_this);
3361
+ }, pipelineEngine_class_private_field_get(this, _sweepIntervalMs)).unref());
3362
+ }
3336
3363
  function pipelineEngine_handleTaskTimeout(task) {
3337
3364
  var _this, _this1;
3338
3365
  var error = prepareTaskTimeout(task, pipelineEngine_class_private_field_get(this, pipelineEngine_metrics));
@@ -3972,9 +3999,9 @@ function enqueueWriter(kind, sql, timeout, token, onRow, scopeId) {
3972
3999
  settled: false,
3973
4000
  timer: null,
3974
4001
  startTime: 0,
3975
- rowParser: null
4002
+ rowParser: null,
4003
+ rows: "query" === kind ? [] : null
3976
4004
  };
3977
- if ("query" === kind) task.rows = [];
3978
4005
  if ("stream" === kind) task.rowParser = setupStreamParser(task, executor_class_private_field_get(_this, _pipeline));
3979
4006
  if (executor_class_private_field_get(_this, _txScope).isDeferred(scopeId)) executor_class_private_field_get(_this, _txScope).defer(task);
3980
4007
  else executor_class_private_field_get(_this, _pipeline).enqueue(task);