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
  /**
@@ -340,10 +340,11 @@ function createJsonValueParser(onValue) {
340
340
  }
341
341
  if (consumeUntil > 0) {
342
342
  this._consumed = consumeUntil;
343
- this.readPos = this._consumed;
343
+ this.readPos = -1 !== this.start ? this.buffer.length : this._consumed;
344
344
  if (this._consumed > 65536) {
345
+ if (-1 !== this.start) this.start -= this._consumed;
345
346
  this.buffer = this.buffer.slice(this._consumed);
346
- this.readPos = 0;
347
+ this.readPos = this.buffer.length;
347
348
  this._consumed = 0;
348
349
  }
349
350
  } else this.readPos = this.buffer.length;
@@ -1353,10 +1354,11 @@ function classifySingle(stmt) {
1353
1354
  return READ_ONLY_KINDS.has(kind) ? "read" : "write";
1354
1355
  }
1355
1356
  function classifySQL(sql) {
1356
- if ("string" != typeof sql || 0 === sql.trim().length) return "write";
1357
+ if ("string" != typeof sql) return "write";
1357
1358
  var cached = _classifyCache.get(sql);
1358
1359
  if (void 0 !== cached) return cached;
1359
1360
  var trimmed = sql.trim();
1361
+ if (0 === trimmed.length) return "write";
1360
1362
  var result;
1361
1363
  if (trimmed.includes(";")) {
1362
1364
  var stmts = trimmed.split(";");
@@ -1780,7 +1782,7 @@ function buildPayload(sql, token) {
1780
1782
  return "".concat(normalized).concat(suffix, "\nSELECT '").concat(token, "' AS ").concat(TOKEN_COLUMN, ";\n");
1781
1783
  }
1782
1784
  function isTransactionControl(sql) {
1783
- var s = sql.trim().toUpperCase();
1785
+ var s = sql.toUpperCase();
1784
1786
  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 ");
1785
1787
  }
1786
1788
  function buildBatchPayload(batch) {
@@ -1847,8 +1849,9 @@ function buildBatchPayload(batch) {
1847
1849
  }
1848
1850
  return parts1.join("");
1849
1851
  }
1852
+ var TC_FIRST_CHAR = TOKEN_COLUMN.charCodeAt(0);
1850
1853
  function isSentinelRaw(raw, token) {
1851
- return raw === '[{"'.concat(TOKEN_COLUMN, '":"').concat(token, '"}]');
1854
+ return raw.charCodeAt(3) === TC_FIRST_CHAR && raw === '[{"'.concat(TOKEN_COLUMN, '":"').concat(token, '"}]');
1852
1855
  }
1853
1856
  function isSentinelRow(value, token) {
1854
1857
  var _value_;
@@ -1914,7 +1917,6 @@ function settleTask(task, error, value, metrics) {
1914
1917
  var _ref = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : {}, _ref_resetRowParser = _ref.resetRowParser, resetRowParser = void 0 === _ref_resetRowParser ? false : _ref_resetRowParser;
1915
1918
  if (task.settled) return;
1916
1919
  task.settled = true;
1917
- clearTimeout(task.timer);
1918
1920
  if (resetRowParser) {
1919
1921
  var _task_rowParser_reset, _task_rowParser;
1920
1922
  null == (_task_rowParser = task.rowParser) || null == (_task_rowParser_reset = _task_rowParser.reset) || _task_rowParser_reset.call(_task_rowParser);
@@ -1963,8 +1965,6 @@ function finalizePendingTasks(tasks, settle, pumpQueue) {
1963
1965
  function prepareTaskTimeout(task, metrics) {
1964
1966
  if (task.settled) return null;
1965
1967
  task.timedout = true;
1966
- clearTimeout(task.timer);
1967
- task.timer = null;
1968
1968
  null == metrics || metrics.incrementTasksTimeout();
1969
1969
  return createTimeoutError(task.timeout, task.sql);
1970
1970
  }
@@ -3093,16 +3093,17 @@ function pipelineEngine_unsupported_iterable_to_array(o, minLen) {
3093
3093
  if ("Map" === n || "Set" === n) return Array.from(n);
3094
3094
  if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return pipelineEngine_array_like_to_array(o, minLen);
3095
3095
  }
3096
- 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();
3096
+ 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();
3097
3097
  var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3098
3098
  "use strict";
3099
3099
  function PipelineEngine(processManager, param) {
3100
3100
  var _this = this;
3101
- 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;
3101
+ 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;
3102
3102
  pipelineEngine_class_call_check(this, PipelineEngine);
3103
3103
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_pumpQueue);
3104
3104
  pipelineEngine_class_private_method_init(this, pipelineEngine_handleParsedValue);
3105
3105
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_scheduleFinalizeCheck);
3106
+ pipelineEngine_class_private_method_init(this, _scheduleSweep);
3106
3107
  pipelineEngine_class_private_method_init(this, core_pipelineEngine_handleTaskTimeout);
3107
3108
  pipelineEngine_class_private_method_init(this, pipelineEngine_settleTask);
3108
3109
  pipelineEngine_class_private_field_init(this, _queue, {
@@ -3157,6 +3158,14 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3157
3158
  writable: true,
3158
3159
  value: false
3159
3160
  });
3161
+ pipelineEngine_class_private_field_init(this, _sweepTimer, {
3162
+ writable: true,
3163
+ value: null
3164
+ });
3165
+ pipelineEngine_class_private_field_init(this, _sweepIntervalMs, {
3166
+ writable: true,
3167
+ value: void 0
3168
+ });
3160
3169
  pipelineEngine_class_private_field_set(this, pipelineEngine_processManager, processManager);
3161
3170
  pipelineEngine_class_private_field_set(this, pipelineEngine_metrics, metrics);
3162
3171
  pipelineEngine_class_private_field_set(this, pipelineEngine_statementTimeout, statementTimeout);
@@ -3170,8 +3179,15 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3170
3179
  pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).setOnDrainCallback(function() {
3171
3180
  return pipelineEngine_class_private_method_get(_this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(_this);
3172
3181
  });
3182
+ pipelineEngine_class_private_field_set(this, _sweepIntervalMs, sweepInterval);
3173
3183
  }
3174
3184
  pipelineEngine_create_class(PipelineEngine, [
3185
+ {
3186
+ key: "_sweepTimer",
3187
+ get: function() {
3188
+ return pipelineEngine_class_private_field_get(this, _sweepTimer);
3189
+ }
3190
+ },
3175
3191
  {
3176
3192
  key: "mainQueue",
3177
3193
  get: function() {
@@ -3222,7 +3238,7 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3222
3238
  value: function(chunk) {
3223
3239
  var task = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)[0];
3224
3240
  if (!task) return;
3225
- if ("stream" === task.kind && task.rowParser && !task.rowParser.finished) {
3241
+ if ("stream" === task.kind && task.rowParser && !task.rowParser.finished && !task.timedout) {
3226
3242
  var leftover = task.rowParser.feed(chunk);
3227
3243
  if (leftover) pipelineEngine_class_private_field_get(this, _sharedValueParser).feed(leftover);
3228
3244
  return;
@@ -3246,6 +3262,7 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3246
3262
  {
3247
3263
  key: "rejectAll",
3248
3264
  value: function(error) {
3265
+ pipelineEngine_class_private_field_get(this, _sharedValueParser).reset();
3249
3266
  var all = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks);
3250
3267
  pipelineEngine_class_private_field_set(this, pipelineEngine_inflightTasks, []);
3251
3268
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
@@ -3292,6 +3309,8 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3292
3309
  key: "kill",
3293
3310
  value: function() {
3294
3311
  pipelineEngine_class_private_field_set(this, _active, false);
3312
+ clearTimeout(pipelineEngine_class_private_field_get(this, _sweepTimer));
3313
+ pipelineEngine_class_private_field_set(this, _sweepTimer, null);
3295
3314
  this.rejectAll(new Error("PipelineEngine is killed"));
3296
3315
  }
3297
3316
  }
@@ -3299,7 +3318,6 @@ var pipelineEngine_PipelineEngine = /*#__PURE__*/ function() {
3299
3318
  return PipelineEngine;
3300
3319
  }();
3301
3320
  function pipelineEngine_pumpQueue() {
3302
- var _this = this;
3303
3321
  var _$_class_private_field_get;
3304
3322
  if (!pipelineEngine_class_private_field_get(this, _active)) return;
3305
3323
  if (pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).draining) return;
@@ -3316,14 +3334,10 @@ function pipelineEngine_pumpQueue() {
3316
3334
  var payload = buildBatchPayload(batch);
3317
3335
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
3318
3336
  try {
3319
- var _loop = function() {
3320
- var task = _step.value;
3321
- task.startTime = now;
3322
- task.timer = setTimeout(function() {
3323
- return pipelineEngine_class_private_method_get(_this, core_pipelineEngine_handleTaskTimeout, pipelineEngine_handleTaskTimeout).call(_this, task);
3324
- }, task.timeout);
3325
- };
3326
- for(var _iterator = batch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
3337
+ for(var _iterator = batch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
3338
+ var task1 = _step.value;
3339
+ task1.startTime = now;
3340
+ }
3327
3341
  } catch (err) {
3328
3342
  _didIteratorError = true;
3329
3343
  _iteratorError = err;
@@ -3335,13 +3349,13 @@ function pipelineEngine_pumpQueue() {
3335
3349
  }
3336
3350
  }
3337
3351
  (_$_class_private_field_get = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)).push.apply(_$_class_private_field_get, pipelineEngine_to_consumable_array(batch));
3352
+ pipelineEngine_class_private_method_get(this, _scheduleSweep, scheduleSweep).call(this);
3338
3353
  pipelineEngine_class_private_field_get(this, pipelineEngine_processManager).write(payload);
3339
3354
  }
3340
3355
  function core_pipelineEngine_handleParsedValue(raw) {
3341
3356
  var task = pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks)[0];
3342
3357
  if (!task) return;
3343
3358
  if (isSentinelRaw(raw, task.token)) {
3344
- clearTimeout(task.timer);
3345
3359
  pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks).shift();
3346
3360
  if (task.timedout) return void pipelineEngine_class_private_method_get(this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(this);
3347
3361
  if (task.consumerError) {
@@ -3363,7 +3377,6 @@ function core_pipelineEngine_handleParsedValue(raw) {
3363
3377
  return;
3364
3378
  }
3365
3379
  if (isSentinelRow(parsed, task.token)) {
3366
- clearTimeout(task.timer);
3367
3380
  pipelineEngine_class_private_field_get(this, pipelineEngine_inflightTasks).shift();
3368
3381
  if (task.timedout) return void pipelineEngine_class_private_method_get(this, core_pipelineEngine_pumpQueue, pipelineEngine_pumpQueue).call(this);
3369
3382
  if (task.consumerError) {
@@ -3393,6 +3406,20 @@ function pipelineEngine_scheduleFinalizeCheck() {
3393
3406
  });
3394
3407
  });
3395
3408
  }
3409
+ function scheduleSweep() {
3410
+ var _this = this;
3411
+ if (pipelineEngine_class_private_field_get(this, _sweepTimer)) return;
3412
+ pipelineEngine_class_private_field_set(this, _sweepTimer, setTimeout(function() {
3413
+ pipelineEngine_class_private_field_set(_this, _sweepTimer, null);
3414
+ var inflight = pipelineEngine_class_private_field_get(_this, pipelineEngine_inflightTasks);
3415
+ var now = performance.now();
3416
+ for(var i = 0; i < inflight.length; i++){
3417
+ var task = inflight[i];
3418
+ if (now - task.startTime > task.timeout) pipelineEngine_class_private_method_get(_this, core_pipelineEngine_handleTaskTimeout, pipelineEngine_handleTaskTimeout).call(_this, task);
3419
+ }
3420
+ if (pipelineEngine_class_private_field_get(_this, pipelineEngine_inflightTasks).length > 0) pipelineEngine_class_private_method_get(_this, _scheduleSweep, scheduleSweep).call(_this);
3421
+ }, pipelineEngine_class_private_field_get(this, _sweepIntervalMs)).unref());
3422
+ }
3396
3423
  function pipelineEngine_handleTaskTimeout(task) {
3397
3424
  var _this, _this1;
3398
3425
  var error = prepareTaskTimeout(task, pipelineEngine_class_private_field_get(this, pipelineEngine_metrics));
@@ -4032,9 +4059,9 @@ function enqueueWriter(kind, sql, timeout, token, onRow, scopeId) {
4032
4059
  settled: false,
4033
4060
  timer: null,
4034
4061
  startTime: 0,
4035
- rowParser: null
4062
+ rowParser: null,
4063
+ rows: "query" === kind ? [] : null
4036
4064
  };
4037
- if ("query" === kind) task.rows = [];
4038
4065
  if ("stream" === kind) task.rowParser = setupStreamParser(task, executor_class_private_field_get(_this, _pipeline));
4039
4066
  if (executor_class_private_field_get(_this, _txScope).isDeferred(scopeId)) executor_class_private_field_get(_this, _txScope).defer(task);
4040
4067
  else executor_class_private_field_get(_this, _pipeline).enqueue(task);