@steedos-labs/plugin-workflow 3.0.63 → 3.0.64

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.
@@ -485,14 +485,11 @@ InstanceRecordQueue.Configure = function (options) {
485
485
 
486
486
  // Universal send function
487
487
  var _querySend = async function (doc) {
488
- console.log(`[InstanceRecordQueue._querySend] 开始调用 sendDoc: docId=${doc._id}, insId=${doc.info.instance_id}`);
489
488
  if (InstanceRecordQueue.sendDoc) {
490
489
  try {
491
490
  await InstanceRecordQueue.sendDoc(doc);
492
- console.log(`[InstanceRecordQueue._querySend] sendDoc 执行完成: docId=${doc._id}`);
493
491
  } catch (error) {
494
- console.error(`[InstanceRecordQueue._querySend] sendDoc 执行异常: docId=${doc._id}, error=${error.message}`);
495
- console.error(`[InstanceRecordQueue._querySend] 错误堆栈: ${error.stack}`);
492
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue._querySend] sendDoc 异常: docId=${doc._id}, error=${error.message}`);
496
493
  throw error;
497
494
  }
498
495
  } else {
@@ -513,11 +510,9 @@ InstanceRecordQueue.Configure = function (options) {
513
510
 
514
511
  if (options.sendInterval !== null) {
515
512
  var sendDoc = async function (doc) {
516
- console.log(`[InstanceRecordQueue.sendDoc-queue] 处理队列文档: docId=${doc._id}, insId=${doc.info.instance_id}`);
517
513
  // Reserve doc
518
514
  var now = +new Date();
519
515
  var timeoutAt = now + options.sendTimeout;
520
- console.log(`[InstanceRecordQueue.sendDoc-queue] 尝试 reserve 文档: docId=${doc._id}, now=${now}, timeoutAt=${timeoutAt}`);
521
516
  var reserved = await InstanceRecordQueue.collection.update({
522
517
  _id: doc._id,
523
518
  sent: false, // xxx: need to make sure this is set on create
@@ -532,20 +527,16 @@ InstanceRecordQueue.Configure = function (options) {
532
527
 
533
528
  // Make sure we only handle docs reserved by this instance
534
529
  if (reserved) {
535
- console.log(`[InstanceRecordQueue.sendDoc-queue] 文档 reserve 成功: docId=${doc._id}, 开始调用 serverSend`);
536
530
  // Send
537
531
  var result = await self.serverSend(doc);
538
- console.log(`[InstanceRecordQueue.sendDoc-queue] serverSend 返回结果: docId=${doc._id}, result=${JSON.stringify(result)}`);
539
532
 
540
533
  if (!options.keepDocs) {
541
534
  // Pr. Default we will remove docs
542
- console.log(`[InstanceRecordQueue.sendDoc-queue] keepDocs=false, 删除文档: docId=${doc._id}`);
543
535
  await InstanceRecordQueue.collection.remove({
544
536
  _id: doc._id
545
537
  });
546
538
  } else {
547
539
  // Update
548
- console.log(`[InstanceRecordQueue.sendDoc-queue] keepDocs=true, 设置 sent=true: docId=${doc._id}`);
549
540
  await InstanceRecordQueue.collection.update({
550
541
  _id: doc._id
551
542
  }, {
@@ -565,9 +556,7 @@ InstanceRecordQueue.Configure = function (options) {
565
556
  }; // EO sendDoc
566
557
 
567
558
  sendWorker(async function () {
568
- console.log(`[InstanceRecordQueue.sendWorker] 定时器触发,开始处理待发送文档...`);
569
559
  if (isSendingDoc) {
570
- console.log(`[InstanceRecordQueue.sendWorker] 上一次还在处理中,跳过本次轮询`);
571
560
  return;
572
561
  }
573
562
  // Set send fence
@@ -577,7 +566,6 @@ InstanceRecordQueue.Configure = function (options) {
577
566
 
578
567
  var now = +new Date();
579
568
 
580
- console.log(`[InstanceRecordQueue.sendWorker] 查询待处理文档: batchSize=${batchSize}, now=${now}`);
581
569
  // Find docs that are not being or already sent
582
570
  var pendingDocs = await InstanceRecordQueue.collection.find({
583
571
  $and: [
@@ -605,14 +593,13 @@ InstanceRecordQueue.Configure = function (options) {
605
593
  },
606
594
  limit: batchSize
607
595
  }).toArray();
608
- console.log(`[InstanceRecordQueue.sendWorker] 找到待处理文档数: ${pendingDocs.length}`);
609
596
 
610
597
  for (const doc of pendingDocs) {
611
598
  try {
612
- console.log(`[InstanceRecordQueue.sendWorker] 处理文档: docId=${doc._id}, insId=${doc.info.instance_id}`);
599
+ console.log(`${new Date().toISOString()} [InstanceRecordQueue.sendWorker] 处理文档: docId=${doc._id}, insId=${doc.info.instance_id}`);
613
600
  await sendDoc(doc);
614
601
  } catch (error) {
615
- console.error(`[InstanceRecordQueue.sendWorker] 文档处理异常: docId=${doc._id}`);
602
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendWorker] 文档处理异常: docId=${doc._id}`);
616
603
  console.error(error.stack);
617
604
  console.log('InstanceRecordQueue: Could not send doc id: "' + doc._id + '", Error: ' + error.message);
618
605
  await InstanceRecordQueue.collection.update({
@@ -628,7 +615,6 @@ InstanceRecordQueue.Configure = function (options) {
628
615
 
629
616
  // Remove the send fence
630
617
  isSendingDoc = false;
631
- console.log(`[InstanceRecordQueue.sendWorker] 本次轮询完成,已处理 ${pendingDocs.length} 个文档`);
632
618
  }, options.sendInterval || 15000); // Default every 15th sec
633
619
  } else {
634
620
  if (InstanceRecordQueue.debug) {
@@ -980,6 +966,10 @@ InstanceRecordQueue.syncValues = async function (field_map_back, values, ins, ob
980
966
  var relatedObjectName = key;
981
967
  var relatedObjectValues = [];
982
968
  var relatedObjectFields = await getObjectFields(relatedObjectName)
969
+ if (!values[tableCode] || !Array.isArray(values[tableCode])) {
970
+ console.warn(`[InstanceRecordQueue.syncValues] tableToRelated: values['${tableCode}'] is empty or not an array, skipping related object '${relatedObjectName}'`);
971
+ continue;
972
+ }
983
973
  for (const tableValueItem of values[tableCode]) {
984
974
  let relateRecord;
985
975
  if (tableValueItem._id) {
@@ -1099,7 +1089,7 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1099
1089
  const docId = doc._id;
1100
1090
  const insId = doc.info.instance_id;
1101
1091
 
1102
- console.log(`[InstanceRecordQueue.sendDoc] 开始处理文档: docId=${docId}, insId=${insId}, 时间=${startTime.toISOString()}`);
1092
+ console.log(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 开始处理: insId=${insId}`);
1103
1093
 
1104
1094
  if (InstanceRecordQueue.debug) {
1105
1095
  console.log("sendDoc:");
@@ -1107,7 +1097,6 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1107
1097
  }
1108
1098
 
1109
1099
  var records = doc.info.records;
1110
- console.log(`[InstanceRecordQueue.sendDoc] 文档中的记录数: ${records ? records.length : 0}`);
1111
1100
 
1112
1101
  var fields = {
1113
1102
  flow: 1,
@@ -1125,18 +1114,15 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1125
1114
  fields[f] = 1;
1126
1115
  })
1127
1116
 
1128
- console.log(`[InstanceRecordQueue.sendDoc] 查询实例: insId=${insId}`);
1129
1117
  var ins = await objectql.getObject('instances').findOne(insId, {
1130
1118
  fields: fields
1131
1119
  })
1132
1120
 
1133
1121
  if (!ins) {
1134
- console.error(`[InstanceRecordQueue.sendDoc] 无法找到实例: insId=${insId}`);
1122
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 实例不存在: insId=${insId}`);
1135
1123
  throw new Error(`Instance not found: ${insId}`);
1136
1124
  }
1137
1125
 
1138
- console.log(`[InstanceRecordQueue.sendDoc] 获取实例成功: insId=${insId}, 实例状态=${ins.state}, 实例名称=${ins.name}`);
1139
-
1140
1126
  var values = ins.values,
1141
1127
  spaceId = ins.space;
1142
1128
 
@@ -1146,21 +1132,18 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1146
1132
  }
1147
1133
 
1148
1134
  const flowId = ins.flow
1149
- console.log(`[InstanceRecordQueue.sendDoc] 查询流程: flowId=${flowId}`);
1150
1135
  const flow = await objectql.getObject('flows').findOne(flowId, { fields: { enable_amisform: 1 } })
1151
1136
 
1152
1137
  if (!flow) {
1153
- console.error(`[InstanceRecordQueue.sendDoc] 无法找到流程: flowId=${flowId}`);
1138
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 流程不存在: flowId=${flowId}`);
1154
1139
  throw new Error(`Flow not found: ${flowId}`);
1155
1140
  }
1156
1141
 
1157
1142
  const enableAmisform = flow.enable_amisform
1158
- console.log(`[InstanceRecordQueue.sendDoc] 流程启用Amisform: ${enableAmisform}`);
1159
1143
 
1160
1144
  if (records && !_.isEmpty(records)) {
1161
1145
  // 此情况属于从creator中发起审批,或者已经从Apps同步到了creator
1162
1146
  var objectName = records[0].o;
1163
- console.log(`[InstanceRecordQueue.sendDoc] 检测到记录: objectName=${objectName}, recordIds=${JSON.stringify(records[0].ids)}`);
1164
1147
 
1165
1148
  var ow = await objectql.getObject('object_workflows').findOne({
1166
1149
  object_name: objectName,
@@ -1168,39 +1151,32 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1168
1151
  });
1169
1152
 
1170
1153
  if (!ow) {
1171
- console.error(`[InstanceRecordQueue.sendDoc] 无法找到对象工作流配置: objectName=${objectName}, flowId=${ins.flow}`);
1154
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 对象工作流配置不存在: objectName=${objectName}, flowId=${ins.flow}`);
1172
1155
  throw new Error(`ObjectWorkflow not found for object=${objectName}, flow=${ins.flow}`);
1173
1156
  }
1174
1157
 
1175
- console.log(`[InstanceRecordQueue.sendDoc] 获取对象工作流配置: objectName=${objectName}`);
1158
+ console.log(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 同步到对象: objectName=${objectName}`);
1176
1159
 
1177
1160
  var objectCollection = objectql.getObject(objectName),
1178
1161
  sync_attachment = ow.sync_attachment;
1179
1162
  syncDirection = ow.sync_direction || 'both';
1180
- console.log(`[InstanceRecordQueue.sendDoc] 同步方向: ${syncDirection}, 同步附件: ${sync_attachment}`);
1181
1163
 
1182
1164
  var objectInfo = await getObjectConfig(objectName);
1183
- console.log(`[InstanceRecordQueue.sendDoc] 对象配置获取成功: objectName=${objectName}, 字段数=${Object.keys(objectInfo.fields || {}).length}`);
1184
1165
 
1185
1166
  const recordsToProcess = await objectFind(objectName, { filters: [['_id', 'in', records[0].ids]] });
1186
- console.log(`[InstanceRecordQueue.sendDoc] 查询得到的记录数: ${recordsToProcess.length}`);
1187
1167
 
1188
1168
  for (const record of recordsToProcess) {
1189
1169
  const recordId = record._id;
1190
- console.log(`[InstanceRecordQueue.sendDoc] 处理记录: recordId=${recordId}`);
1191
1170
  try {
1192
1171
  if (!['both', 'ins_to_obj'].includes(syncDirection)) {
1193
- console.log(`[InstanceRecordQueue.sendDoc] 跳过记录,同步方向不匹配: ${syncDirection}`);
1194
1172
  continue;
1195
1173
  }
1196
1174
  var lock_record_after_approval = ow.lock_record_after_approval || false;
1197
- console.log(`[InstanceRecordQueue.sendDoc] 同步值: recordId=${recordId}, flowId=${ins.flow}`);
1198
1175
  var syncValues = await InstanceRecordQueue.syncValues(ow.field_map_back, values, ins, objectInfo, ow.field_map_back_script, record, enableAmisform)
1199
1176
  var setObj = syncValues.mainObjectValue;
1200
1177
 
1201
- console.log(`[InstanceRecordQueue.sendDoc] 字段映射结果: recordId=${recordId}, 映射字段数=${Object.keys(setObj).length}`);
1202
1178
  if (InstanceRecordQueue.debug) {
1203
- console.log(`[InstanceRecordQueue.sendDoc] 映射值详情:`, JSON.stringify(setObj, null, 2));
1179
+ console.log(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 映射值详情:`, JSON.stringify(setObj, null, 2));
1204
1180
  }
1205
1181
 
1206
1182
  var instance_state = ins.state;
@@ -1212,13 +1188,10 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1212
1188
  }
1213
1189
  setObj['instances.0.state'] = setObj.instance_state = instance_state;
1214
1190
 
1215
- console.log(`[InstanceRecordQueue.sendDoc] 更新记录: recordId=${recordId}, instanceState=${instance_state}`);
1216
1191
  await objectUpdate(objectName, record._id, setObj);
1217
- console.log(`[InstanceRecordQueue.sendDoc] 记录更新成功: recordId=${recordId}`);
1218
1192
 
1219
1193
  var relatedObjects = await getRelateds(ow.object_name);
1220
1194
  var relatedObjectsValue = syncValues.relatedObjectsValue;
1221
- console.log(`[InstanceRecordQueue.sendDoc] 处理关联对象: 数量=${relatedObjects.length}`);
1222
1195
  await InstanceRecordQueue.syncRelatedObjectsValue(record._id, relatedObjects, relatedObjectsValue, spaceId, ins);
1223
1196
 
1224
1197
  // 以最终申请单附件为准,旧的record中附件删除
@@ -1230,7 +1203,6 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1230
1203
  ids: [record._id]
1231
1204
  }
1232
1205
  });
1233
- console.log(`[InstanceRecordQueue.sendDoc] 删除旧附件: recordId=${recordId}`);
1234
1206
 
1235
1207
  const cfsColl = await getCollection('cfs.files.filerecord');
1236
1208
  await cfsColl.deleteMany({
@@ -1238,16 +1210,11 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1238
1210
  })
1239
1211
 
1240
1212
  // 同步新附件
1241
- console.log(`[InstanceRecordQueue.sendDoc] 同步新附件: recordId=${recordId}, insId=${insId}`);
1242
1213
  await InstanceRecordQueue.syncAttach(sync_attachment, insId, record.space, record._id, objectName);
1243
1214
  // 执行公式
1244
- console.log(`[InstanceRecordQueue.sendDoc] 执行公式: recordId=${recordId}`);
1245
1215
  await runQuoted(objectName, record._id);
1246
- console.log(`[InstanceRecordQueue.sendDoc] 记录处理完成: recordId=${recordId}`);
1247
1216
  } catch (error) {
1248
- console.error(`[InstanceRecordQueue.sendDoc] 记录处理失败: recordId=${recordId}`);
1249
- console.error(`[InstanceRecordQueue.sendDoc] 错误信息:`, error.message);
1250
- console.error(`[InstanceRecordQueue.sendDoc] 错误堆栈:`, error.stack);
1217
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 记录处理失败: recordId=${recordId}, error=${error.message}`);
1251
1218
 
1252
1219
  await objectUpdateMany(objectName, [['_id', '=', record._id], ['instances._id', '=', insId]], {
1253
1220
  'instances.$.state': 'pending',
@@ -1272,38 +1239,31 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1272
1239
  }
1273
1240
  } else {
1274
1241
  // 此情况属于从apps中发起审批
1275
- console.log(`[InstanceRecordQueue.sendDoc] 从Apps发起的审批,创建新记录`);
1276
1242
  const owsColl = await getCollection('object_workflows');
1277
1243
  const ows = await owsColl.find({
1278
1244
  flow_id: ins.flow
1279
1245
  }).toArray();
1280
1246
 
1281
- console.log(`[InstanceRecordQueue.sendDoc] 找到的对象工作流配置数: ${ows.length}`);
1282
1247
  for (const ow of ows) {
1283
1248
  const objectName = ow.object_name;
1284
- console.log(`[InstanceRecordQueue.sendDoc] 处理对象工作流: objectName=${objectName}`);
1285
1249
  try {
1286
1250
  var sync_attachment = ow.sync_attachment,
1287
1251
  newRecordId = await makeNewID(ow.object_name),
1288
1252
  syncDirection = ow.sync_direction || 'both';
1289
1253
  lock_record_after_approval = ow.lock_record_after_approval || false;
1254
+ var recordInserted = false;
1290
1255
 
1291
- console.log(`[InstanceRecordQueue.sendDoc] 新建记录: recordId=${newRecordId}, objectName=${objectName}, syncDirection=${syncDirection}`);
1256
+ console.log(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 新建记录: objectName=${objectName}, recordId=${newRecordId}`);
1292
1257
 
1293
1258
  if (!['both', 'ins_to_obj'].includes(syncDirection)) {
1294
- console.log(`[InstanceRecordQueue.sendDoc] 跳过对象工作流,同步方向不匹配: ${syncDirection}`);
1295
1259
  continue;
1296
1260
  }
1297
1261
 
1298
1262
  var objectInfo = await getObjectConfig(ow.object_name);
1299
- console.log(`[InstanceRecordQueue.sendDoc] 获取对象配置: objectName=${objectName}, 字段数=${Object.keys(objectInfo.fields || {}).length}`);
1300
1263
 
1301
- console.log(`[InstanceRecordQueue.sendDoc] 同步字段值: objectName=${objectName}`);
1302
1264
  var syncValues = await InstanceRecordQueue.syncValues(ow.field_map_back, values, ins, objectInfo, ow.field_map_back_script, null, enableAmisform);
1303
1265
  var newObj = syncValues.mainObjectValue;
1304
1266
 
1305
- console.log(`[InstanceRecordQueue.sendDoc] 字段映射完成: objectName=${objectName}, 映射字段数=${Object.keys(newObj).length}`);
1306
-
1307
1267
  newObj.space = spaceId;
1308
1268
  newObj.name = newObj.name || ins.name;
1309
1269
 
@@ -1325,6 +1285,7 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1325
1285
  newObj.modified_by = ins.applicant;
1326
1286
 
1327
1287
  var r = await objectInsert(ow.object_name, newObj);
1288
+ recordInserted = !!r;
1328
1289
  const insColl = await getCollection('instances');
1329
1290
  if (r) {
1330
1291
  await insColl.update({_id: ins._id}, {
@@ -1355,32 +1316,38 @@ InstanceRecordQueue.sendDoc = async function (doc) {
1355
1316
  } catch (error) {
1356
1317
  console.error(error);
1357
1318
 
1358
- await objectRemove(ow.object_name, newRecordId);
1359
- const insColl = await getObject('instances');
1360
- await insColl.update(ins._id, {
1361
- $pull: {
1362
- record_ids: {
1363
- o: objectName,
1364
- ids: [newRecordId]
1365
- }
1366
- },
1367
- $set: {
1368
- modified: new Date()
1369
- }
1370
- });
1319
+ if (recordInserted) {
1320
+ try {
1321
+ await objectRemove(ow.object_name, newRecordId);
1322
+ const insColl = await getObject('instances');
1323
+ await insColl.update(ins._id, {
1324
+ $pull: {
1325
+ record_ids: {
1326
+ o: objectName,
1327
+ ids: [newRecordId]
1328
+ }
1329
+ },
1330
+ $set: {
1331
+ modified: new Date()
1332
+ }
1333
+ });
1371
1334
 
1372
- const cfColl = await getCollection('cms_files');
1373
- await cfColl.deleteMany({
1374
- 'parent': {
1375
- o: objectName,
1376
- ids: [newRecordId]
1377
- }
1378
- });
1335
+ const cfColl = await getCollection('cms_files');
1336
+ await cfColl.deleteMany({
1337
+ 'parent': {
1338
+ o: objectName,
1339
+ ids: [newRecordId]
1340
+ }
1341
+ });
1379
1342
 
1380
- const cfsColl = await getCollection('cfs.files.filerecord');
1381
- await cfsColl.deleteMany({
1382
- 'metadata.record_id': newRecordId
1383
- })
1343
+ const cfsColl = await getCollection('cfs.files.filerecord');
1344
+ await cfsColl.deleteMany({
1345
+ 'metadata.record_id': newRecordId
1346
+ })
1347
+ } catch (cleanupError) {
1348
+ console.error(`${new Date().toISOString()} [InstanceRecordQueue.sendDoc] 清理记录失败: objectName=${objectName}, recordId=${newRecordId}`, cleanupError);
1349
+ }
1350
+ }
1384
1351
  throw error;
1385
1352
  }
1386
1353
  }
@@ -16,7 +16,7 @@ module.exports = {
16
16
  return {};
17
17
  }
18
18
 
19
- // 直接 broker.call page.getMeSchema,完全绕过 vm2 沙箱
19
+ // 直接 broker.call page.getMeSchema 获取页面 schema
20
20
  // 参考 steedos-platform/services/service-pages/main/default/routes/page_schema.router.js
21
21
  // flow_selector 这个 page 的 type 固定为 'page'
22
22
  const result = await objectql.getSteedosSchema().broker.call('page.getMeSchema', {
@@ -35,7 +35,7 @@ TimeoutAutoSubmit.Configure = function (options = {}) {
35
35
  _job = null;
36
36
  }
37
37
 
38
- console.log(`[timeout_auto_submit] Configured with interval: ${sendInterval}ms`);
38
+ console.log(`${new Date().toISOString()} [timeout_auto_submit] Configured with interval: ${sendInterval}ms`);
39
39
 
40
40
  // Convert milliseconds interval to a cron-compatible schedule using node-schedule's RecurrenceRule
41
41
  const intervalSeconds = Math.max(Math.round(sendInterval / 1000), 1);
@@ -56,14 +56,15 @@ TimeoutAutoSubmit.Configure = function (options = {}) {
56
56
  _isProcessing = true;
57
57
  const startTime = Date.now();
58
58
  try {
59
- console.log('[timeout_auto_submit] Starting timeout auto-submit check...');
60
59
  await UUFlowManager.timeoutAutoSubmit();
61
60
  const duration = Date.now() - startTime;
62
- console.log(`[timeout_auto_submit] Completed in ${duration}ms`);
61
+ if (duration > 5000) {
62
+ console.log(`${new Date().toISOString()} [timeout_auto_submit] Completed in ${duration}ms`);
63
+ }
63
64
  } catch (error) {
64
65
  const duration = Date.now() - startTime;
65
- console.error(`[timeout_auto_submit] Fatal error after ${duration}ms: ${error.message}`);
66
- console.error('[timeout_auto_submit] Stack trace:', error.stack);
66
+ console.error(`${new Date().toISOString()} [timeout_auto_submit] Fatal error after ${duration}ms: ${error.message}`);
67
+ console.error(`${new Date().toISOString()} [timeout_auto_submit] Stack trace:`, error.stack);
67
68
  } finally {
68
69
  _isProcessing = false;
69
70
  }
@@ -79,7 +80,7 @@ TimeoutAutoSubmit.Stop = function () {
79
80
  _job = null;
80
81
  }
81
82
  _isProcessing = false;
82
- console.log('[timeout_auto_submit] Stopped');
83
+ console.log(`${new Date().toISOString()} [timeout_auto_submit] Stopped`);
83
84
  };
84
85
 
85
86
  module.exports = TimeoutAutoSubmit;