bullmq 1.59.0 → 1.59.4

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.
Files changed (121) hide show
  1. package/dist/bullmq.d.ts +1839 -0
  2. package/dist/cjs/classes/child-pool.js +4 -4
  3. package/dist/cjs/classes/child-pool.js.map +1 -1
  4. package/dist/cjs/classes/child-processor.js +8 -8
  5. package/dist/cjs/classes/child-processor.js.map +1 -1
  6. package/dist/cjs/classes/flow-producer.js +2 -2
  7. package/dist/cjs/classes/flow-producer.js.map +1 -1
  8. package/dist/cjs/classes/index.js +14 -14
  9. package/dist/cjs/classes/index.js.map +1 -1
  10. package/dist/cjs/classes/job.d.ts +1 -1
  11. package/dist/cjs/classes/job.js +9 -9
  12. package/dist/cjs/classes/job.js.map +1 -1
  13. package/dist/cjs/classes/master.js +2 -2
  14. package/dist/cjs/classes/master.js.map +1 -1
  15. package/dist/cjs/classes/queue-events.js +6 -6
  16. package/dist/cjs/classes/queue-events.js.map +1 -1
  17. package/dist/cjs/classes/queue-scheduler.js +3 -3
  18. package/dist/cjs/classes/queue-scheduler.js.map +1 -1
  19. package/dist/cjs/classes/queue.js +7 -7
  20. package/dist/cjs/classes/queue.js.map +1 -1
  21. package/dist/cjs/classes/redis-connection.js +5 -5
  22. package/dist/cjs/classes/redis-connection.js.map +1 -1
  23. package/dist/cjs/classes/repeat.js +2 -2
  24. package/dist/cjs/classes/repeat.js.map +1 -1
  25. package/dist/cjs/classes/sandbox.js +1 -1
  26. package/dist/cjs/classes/sandbox.js.map +1 -1
  27. package/dist/cjs/classes/scripts.js +2 -2
  28. package/dist/cjs/classes/scripts.js.map +1 -1
  29. package/dist/cjs/classes/timer-manager.js +1 -1
  30. package/dist/cjs/classes/timer-manager.js.map +1 -1
  31. package/dist/cjs/classes/worker.js +11 -17
  32. package/dist/cjs/classes/worker.js.map +1 -1
  33. package/dist/{commands → cjs/commands}/addJob-9.lua +0 -0
  34. package/dist/{commands → cjs/commands}/changeDelay-4.lua +0 -0
  35. package/dist/{commands → cjs/commands}/cleanJobsInSet-2.lua +0 -0
  36. package/dist/{commands → cjs/commands}/drain-4.lua +0 -0
  37. package/dist/{commands → cjs/commands}/extendLock-2.lua +0 -0
  38. package/dist/{commands → cjs/commands}/getState-7.lua +0 -0
  39. package/dist/{commands → cjs/commands}/getStateV2-7.lua +0 -0
  40. package/dist/{commands → cjs/commands}/includes/destructureJobKey.lua +0 -0
  41. package/dist/{commands → cjs/commands}/includes/updateParentDepsIfNeeded.lua +0 -0
  42. package/dist/cjs/commands/index.js +1 -1
  43. package/dist/{commands → cjs/commands}/isFinished-3.lua +0 -0
  44. package/dist/{commands → cjs/commands}/isJobInList-1.lua +0 -0
  45. package/dist/{commands → cjs/commands}/moveStalledJobsToWait-8.lua +0 -0
  46. package/dist/{commands → cjs/commands}/moveToActive-8.lua +0 -0
  47. package/dist/{commands → cjs/commands}/moveToDelayed-5.lua +0 -0
  48. package/dist/{commands → cjs/commands}/moveToFinished-8.lua +0 -0
  49. package/dist/{commands → cjs/commands}/moveToWaitingChildren-4.lua +0 -0
  50. package/dist/{commands → cjs/commands}/obliterate-2.lua +0 -0
  51. package/dist/{commands → cjs/commands}/pause-4.lua +0 -0
  52. package/dist/{commands → cjs/commands}/promote-5.lua +0 -0
  53. package/dist/{commands → cjs/commands}/releaseLock-1.lua +0 -0
  54. package/dist/{commands → cjs/commands}/removeJob-1.lua +0 -0
  55. package/dist/{commands → cjs/commands}/removeRepeatable-2.lua +0 -0
  56. package/dist/{commands → cjs/commands}/reprocessJob-4.lua +0 -0
  57. package/dist/{commands → cjs/commands}/retryJob-4.lua +0 -0
  58. package/dist/cjs/commands/script-loader.js +5 -5
  59. package/dist/cjs/commands/script-loader.js.map +1 -1
  60. package/dist/{commands → cjs/commands}/takeLock-1.lua +0 -0
  61. package/dist/{commands → cjs/commands}/updateDelaySet-7.lua +0 -0
  62. package/dist/{commands → cjs/commands}/updateProgress-2.lua +0 -0
  63. package/dist/cjs/enums/index.js +1 -1
  64. package/dist/cjs/enums/index.js.map +1 -1
  65. package/dist/cjs/index.js +5 -5
  66. package/dist/cjs/index.js.map +1 -1
  67. package/dist/cjs/interfaces/index.js +19 -19
  68. package/dist/cjs/interfaces/index.js.map +1 -1
  69. package/dist/cjs/utils.js +5 -7
  70. package/dist/cjs/utils.js.map +1 -1
  71. package/dist/esm/classes/job.d.ts +1 -1
  72. package/dist/esm/classes/job.js.map +1 -1
  73. package/dist/esm/classes/redis-connection.js +3 -3
  74. package/dist/esm/classes/redis-connection.js.map +1 -1
  75. package/dist/esm/classes/scripts.js.map +1 -1
  76. package/dist/esm/classes/worker.js +3 -9
  77. package/dist/esm/classes/worker.js.map +1 -1
  78. package/dist/esm/commands/addJob-9.lua +179 -0
  79. package/dist/esm/commands/changeDelay-4.lua +41 -0
  80. package/dist/esm/commands/cleanJobsInSet-2.lua +65 -0
  81. package/dist/esm/commands/drain-4.lua +36 -0
  82. package/dist/esm/commands/extendLock-2.lua +23 -0
  83. package/dist/esm/commands/getState-7.lua +63 -0
  84. package/dist/esm/commands/getStateV2-7.lua +51 -0
  85. package/dist/esm/commands/includes/destructureJobKey.lua +12 -0
  86. package/dist/esm/commands/includes/updateParentDepsIfNeeded.lua +19 -0
  87. package/dist/esm/commands/isFinished-3.lua +48 -0
  88. package/dist/esm/commands/isJobInList-1.lua +20 -0
  89. package/dist/esm/commands/moveStalledJobsToWait-8.lua +112 -0
  90. package/dist/esm/commands/moveToActive-8.lua +100 -0
  91. package/dist/esm/commands/moveToDelayed-5.lua +45 -0
  92. package/dist/esm/commands/moveToFinished-8.lua +159 -0
  93. package/dist/esm/commands/moveToWaitingChildren-4.lua +60 -0
  94. package/dist/esm/commands/obliterate-2.lua +129 -0
  95. package/dist/esm/commands/pause-4.lua +27 -0
  96. package/dist/esm/commands/promote-5.lua +54 -0
  97. package/dist/esm/commands/releaseLock-1.lua +19 -0
  98. package/dist/esm/commands/removeJob-1.lua +115 -0
  99. package/dist/esm/commands/removeRepeatable-2.lua +23 -0
  100. package/dist/esm/commands/reprocessJob-4.lua +32 -0
  101. package/dist/esm/commands/retryJob-4.lua +34 -0
  102. package/dist/esm/commands/takeLock-1.lua +17 -0
  103. package/dist/esm/commands/updateDelaySet-7.lua +73 -0
  104. package/dist/esm/commands/updateProgress-2.lua +15 -0
  105. package/dist/esm/interfaces/advanced-options.js +0 -1
  106. package/dist/esm/interfaces/backoff-options.js +0 -1
  107. package/dist/esm/interfaces/child-message.js +0 -1
  108. package/dist/esm/interfaces/connection.js +0 -1
  109. package/dist/esm/interfaces/flow-job.js +0 -1
  110. package/dist/esm/interfaces/jobs-options.js +0 -1
  111. package/dist/esm/interfaces/parent-message.js +0 -1
  112. package/dist/esm/interfaces/parent.js +0 -1
  113. package/dist/esm/interfaces/queue-scheduler-options.js +0 -1
  114. package/dist/esm/interfaces/rate-limiter-options.js +0 -1
  115. package/dist/esm/interfaces/redis-options.js +0 -1
  116. package/dist/esm/interfaces/redis-streams.js +0 -1
  117. package/dist/esm/interfaces/repeat-options.js +0 -1
  118. package/dist/esm/interfaces/sandboxed-job-processor.js +0 -1
  119. package/dist/esm/interfaces/sandboxed-job.js +0 -1
  120. package/dist/esm/interfaces/worker-options.js +0 -1
  121. package/package.json +6 -5
@@ -0,0 +1,115 @@
1
+ --[[
2
+ Remove a job from all the queues it may be in as well as all its data.
3
+ In order to be able to remove a job, it cannot be active.
4
+
5
+ Input:
6
+ KEYS[1] jobId
7
+ ARGV[1] jobId
8
+
9
+ Events:
10
+ 'removed'
11
+ ]]
12
+
13
+ local rcall = redis.call
14
+
15
+ -- Includes
16
+ --- @include "includes/destructureJobKey"
17
+
18
+ -- recursively check if there are no locks on the
19
+ -- jobs to be removed.
20
+ local function isLocked( prefix, jobId)
21
+ local jobKey = prefix .. jobId;
22
+
23
+ -- Check if this job is locked
24
+ local lockKey = jobKey .. ':lock'
25
+ local lock = rcall("GET", lockKey)
26
+ if not lock then
27
+ local dependencies = rcall("SMEMBERS", jobKey .. ":dependencies")
28
+ if (#dependencies > 0) then
29
+ for i, childJobKey in ipairs(dependencies) do
30
+ -- We need to get the jobId for this job.
31
+ local childJobId = getJobIdFromKey(childJobKey)
32
+ local childJobPrefix = getJobKeyPrefix(childJobKey, childJobId)
33
+ local result = isLocked( childJobPrefix, childJobId )
34
+ if result then
35
+ return true
36
+ end
37
+ end
38
+ end
39
+ return false
40
+ end
41
+ return true
42
+ end
43
+
44
+ local function removeJob( prefix, jobId)
45
+ local jobKey = prefix .. jobId;
46
+
47
+ -- Check if this job has a parent. If so we will just remove it from
48
+ -- the parent child list, but if it is the last child we should move the parent to "wait/paused"
49
+ -- which requires code from "moveToFinished"
50
+ local parentKey = rcall("HGET", jobKey, "parentKey")
51
+ if( (type(parentKey) == "string") and parentKey ~= "" and (rcall("EXISTS", parentKey) == 1)) then
52
+ local parentDependenciesKey = parentKey .. ":dependencies"
53
+ local result = rcall("SREM", parentDependenciesKey, jobKey)
54
+ if rcall("SCARD", parentDependenciesKey) == 0 then
55
+ local parentId = getJobIdFromKey(parentKey)
56
+ local parentPrefix = getJobKeyPrefix(parentKey, parentId)
57
+
58
+ rcall("ZREM", parentPrefix .. "waiting-children", parentId)
59
+
60
+ if rcall("HEXISTS", parentPrefix .. "meta", "paused") ~= 1 then
61
+ rcall("RPUSH", parentPrefix .. "wait", parentId)
62
+ else
63
+ rcall("RPUSH", parentPrefix .. "parentPrefixpaused", parentId)
64
+ end
65
+
66
+ local parentEventStream = parentPrefix .. "events"
67
+ rcall("XADD", parentEventStream, "*", "event", "active", "jobId", parentId, "prev", "waiting-children")
68
+ end
69
+ end
70
+
71
+ rcall("LREM", prefix .. "active", 0, jobId)
72
+ rcall("LREM", prefix .. "wait", 0, jobId)
73
+ rcall("ZREM", prefix .. "delayed", jobId)
74
+ rcall("LREM", prefix .. "paused", 0, jobId)
75
+ rcall("ZREM", prefix .. "completed", jobId)
76
+ rcall("ZREM", prefix .. "failed", jobId)
77
+ rcall("ZREM", prefix .. "priority", jobId)
78
+ rcall("ZREM", prefix .. "waiting-children", jobId)
79
+ rcall("DEL", jobKey)
80
+ rcall("DEL", jobKey .. ":logs")
81
+ rcall("DEL", jobKey .. ":processed")
82
+
83
+ -- Check if this job has children
84
+ -- If so, we are going to try to remove the children recursively in deep first way because
85
+ -- if some job is locked we must exit with and error.
86
+ local dependencies = rcall("SMEMBERS", jobKey .. ":dependencies")
87
+ if (#dependencies > 0) then
88
+ for i, childJobKey in ipairs(dependencies) do
89
+ -- We need to get the jobId for this job.
90
+ local childJobId = getJobIdFromKey(childJobKey)
91
+ local childJobPrefix = getJobKeyPrefix(childJobKey, childJobId)
92
+ removeJob( childJobPrefix, childJobId )
93
+ end
94
+ end
95
+
96
+ rcall("DEL", jobKey .. ":dependencies")
97
+
98
+ -- -- delete keys related to rate limiter
99
+ -- local limiterIndexTable = KEYS[10] .. ":index"
100
+ -- local limitedSetKey = rcall("HGET", limiterIndexTable, jobId)
101
+ -- if limitedSetKey then
102
+ -- rcall("SREM", limitedSetKey, jobId)
103
+ -- rcall("HDEL", limiterIndexTable, jobId)
104
+ -- end
105
+
106
+ rcall("XADD", prefix .. "events", "*", "event", "removed", "jobId", jobId, "prev", "unknown");
107
+ end
108
+
109
+ local prefix = getJobKeyPrefix(KEYS[1], ARGV[1])
110
+
111
+ if not isLocked(prefix, ARGV[1]) then
112
+ removeJob(prefix, ARGV[1])
113
+ return 1
114
+ end
115
+ return 0
@@ -0,0 +1,23 @@
1
+
2
+ --[[
3
+ Removes a repeatable job
4
+ Input:
5
+ KEYS[1] repeat jobs key
6
+ KEYS[2] delayed jobs key
7
+
8
+ ARGV[1] repeat job id
9
+ ARGV[2] repeat job key
10
+ ARGV[3] queue key
11
+ ]]
12
+ local rcall = redis.call
13
+ local millis = rcall("ZSCORE", KEYS[1], ARGV[2])
14
+
15
+ if(millis) then
16
+ -- Delete next programmed job.
17
+ local repeatJobId = ARGV[1] .. millis
18
+ if(rcall("ZREM", KEYS[2], repeatJobId) == 1) then
19
+ rcall("DEL", ARGV[3] .. repeatJobId)
20
+ end
21
+ end
22
+
23
+ rcall("ZREM", KEYS[1], ARGV[2]);
@@ -0,0 +1,32 @@
1
+ --[[
2
+ Attempts to reprocess a job
3
+
4
+ Input:
5
+ KEYS[1] job key
6
+ KEYS[2] events stream
7
+ KEYS[3] job state
8
+ KEYS[4] wait key
9
+
10
+ ARGV[1] job.id,
11
+ ARGV[2] (job.opts.lifo ? 'R' : 'L') + 'PUSH'
12
+
13
+ Output:
14
+ 1 means the operation was a success
15
+ -1 means the job does not exist
16
+ -3 means the job was not found in the expected set.
17
+ ]]
18
+ local rcall = redis.call;
19
+ if (rcall("EXISTS", KEYS[1]) == 1) then
20
+ local jobId = ARGV[1]
21
+ if (rcall("ZREM", KEYS[3], jobId) == 1) then
22
+ rcall(ARGV[2], KEYS[4], jobId)
23
+
24
+ -- Emit waiting event
25
+ rcall("XADD", KEYS[2], "*", "event", "waiting", "jobId", jobId);
26
+ return 1
27
+ else
28
+ return -3
29
+ end
30
+ else
31
+ return -1
32
+ end
@@ -0,0 +1,34 @@
1
+ --[[
2
+ Retries a failed job by moving it back to the wait queue.
3
+
4
+ Input:
5
+ KEYS[1] 'active',
6
+ KEYS[2] 'wait'
7
+ KEYS[3] jobId
8
+ KEYS[4] events stream
9
+
10
+ ARGV[1] pushCmd
11
+ ARGV[2] jobId
12
+ ARGV[3] token
13
+
14
+ Events:
15
+ 'prefix:added'
16
+
17
+ Output:
18
+ 0 - OK
19
+ -1 - Missing key
20
+ ]]
21
+ local rcall = redis.call
22
+
23
+ if rcall("EXISTS", KEYS[3]) == 1 then
24
+
25
+ rcall("LREM", KEYS[1], 0, ARGV[2])
26
+ rcall(ARGV[1], KEYS[2], ARGV[2])
27
+
28
+ -- Emit waiting event
29
+ rcall("XADD", KEYS[4], "*", "event", "waiting", "jobId", ARGV[2], "prev", "failed");
30
+
31
+ return 0
32
+ else
33
+ return -1
34
+ end
@@ -0,0 +1,17 @@
1
+ --[[
2
+ Takes a lock
3
+
4
+ Input:
5
+ KEYS[1] 'lock',
6
+
7
+ ARGV[1] token
8
+ ARGV[2] lock duration in milliseconds
9
+
10
+ Output:
11
+ "OK" if lock extented succesfully.
12
+ ]]
13
+ if redis.call("SET", KEYS[1], ARGV[1], "NX", "PX", ARGV[2]) then
14
+ return 1
15
+ else
16
+ return 0
17
+ end
@@ -0,0 +1,73 @@
1
+ --[[
2
+ Updates the delay set, by picking a delayed job that should
3
+ be processed now.
4
+
5
+ Input:
6
+ KEYS[1] 'delayed'
7
+ KEYS[2] 'wait'
8
+ KEYS[3] 'priority'
9
+ KEYS[4] 'paused'
10
+ KEYS[5] 'meta'
11
+
12
+ KEYS[6] event's stream
13
+ KEYS[7] delayed stream
14
+
15
+ ARGV[1] queue.toKey('')
16
+ ARGV[2] delayed timestamp
17
+
18
+ Events:
19
+ 'waiting'
20
+ ]]
21
+ local rcall = redis.call
22
+
23
+ -- Try to get as much as 1000 jobs at once
24
+ local jobs = rcall("ZRANGEBYSCORE", KEYS[1], 0, tonumber(ARGV[2]) * 0x1000,
25
+ "LIMIT", 0, 1000)
26
+
27
+ if (#jobs > 0) then
28
+ rcall("ZREM", KEYS[1], unpack(jobs))
29
+
30
+ -- check if we need to use push in paused instead of waiting
31
+ local target
32
+ if rcall("HEXISTS", KEYS[5], "paused") ~= 1 then
33
+ target = KEYS[2]
34
+ else
35
+ target = KEYS[4]
36
+ end
37
+
38
+ for _, jobId in ipairs(jobs) do
39
+ local priority =
40
+ tonumber(rcall("HGET", ARGV[1] .. jobId, "priority")) or 0
41
+
42
+ if priority == 0 then
43
+ -- LIFO or FIFO
44
+ rcall("LPUSH", target, jobId)
45
+ else
46
+ -- Priority add
47
+ rcall("ZADD", KEYS[3], priority, jobId)
48
+ local count = rcall("ZCOUNT", KEYS[3], 0, priority)
49
+
50
+ local len = rcall("LLEN", target)
51
+ local id = rcall("LINDEX", target, len - (count - 1))
52
+ if id then
53
+ rcall("LINSERT", target, "BEFORE", id, jobId)
54
+ else
55
+ rcall("RPUSH", target, jobId)
56
+ end
57
+ end
58
+
59
+ -- Emit waiting event
60
+ rcall("XADD", KEYS[6], "*", "event", "waiting", "jobId", jobId, "prev",
61
+ "delayed")
62
+ rcall("HSET", ARGV[1] .. jobId, "delay", 0)
63
+ end
64
+ end
65
+
66
+ local nextTimestamp = rcall("ZRANGE", KEYS[1], 0, 0, "WITHSCORES")[2]
67
+ local id
68
+ if (nextTimestamp ~= nil) then
69
+ nextTimestamp = nextTimestamp / 0x1000
70
+ id = rcall("XADD", KEYS[7], "*", "nextTimestamp", nextTimestamp)
71
+ end
72
+
73
+ return {nextTimestamp, id}
@@ -0,0 +1,15 @@
1
+ --[[
2
+ Update job progress
3
+
4
+ Input:
5
+ KEYS[1] Job id key
6
+ KEYS[2] event stream key
7
+
8
+ ARGV[1] id
9
+ ARGV[2] progress
10
+
11
+ Event:
12
+ progress(jobId, progress)
13
+ ]]
14
+ redis.call("HSET", KEYS[1], "progress", ARGV[2])
15
+ redis.call("XADD", KEYS[2], "*", "event", "progress", "jobId", ARGV[1], "data", ARGV[2]);
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=advanced-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=backoff-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=child-message.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=connection.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=flow-job.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=jobs-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=parent-message.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=parent.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=queue-scheduler-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=rate-limiter-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=redis-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=redis-streams.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=repeat-options.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=sandboxed-job-processor.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=sandboxed-job.js.map
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=worker-options.js.map
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "bullmq",
3
- "version": "1.59.0",
3
+ "version": "1.59.4",
4
4
  "description": "Queue for messages and jobs based on Redis",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
7
+ "jsnext:main": "dist/esm/index.js",
7
8
  "types": "dist/esm/index.d.ts",
8
9
  "source": "src/index.ts",
9
10
  "author": "Taskforce.sh Inc.",
@@ -20,9 +21,9 @@
20
21
  ],
21
22
  "scripts": {
22
23
  "build": "npm-run-all tsc:all copy:lua copy:includes:lua clean:temp:files",
23
- "clean:temp:files": "rimraf dist/bullmq.d.ts dist/tsdoc-metadata.json",
24
- "copy:lua": "copyfiles -f ./src/commands/*.lua ./dist/commands",
25
- "copy:includes:lua": "copyfiles -f ./src/commands/includes/*.lua ./dist/commands/includes",
24
+ "clean:temp:files": "rimraf dist/cjs/bullmq.d.ts dist/esm/bullmq.d.ts dist/tsdoc-metadata.json",
25
+ "copy:lua": "copyfiles -f ./src/commands/*.lua ./dist/cjs/commands && copyfiles -f ./src/commands/*.lua ./dist/esm/commands",
26
+ "copy:includes:lua": "copyfiles -f ./src/commands/includes/*.lua ./dist/cjs/commands/includes && copyfiles -f ./src/commands/includes/*.lua ./dist/esm/commands/includes",
26
27
  "coverage": "nyc --reporter=text npm run test",
27
28
  "coveralls": "nyc report --reporter=text-lcov | coveralls",
28
29
  "cm": "git cz",
@@ -106,7 +107,7 @@
106
107
  "test-console": "^2.0.0",
107
108
  "ts-mocha": "^8.0.0",
108
109
  "ts-node": "^8.10.2",
109
- "typescript": "^4.5.2"
110
+ "typescript": "3.9.10"
110
111
  },
111
112
  "nyc": {
112
113
  "extends": "@istanbuljs/nyc-config-typescript",