mysql-boss 0.1.0

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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +688 -0
  3. package/dist/cjs/archive.d.ts +8 -0
  4. package/dist/cjs/archive.d.ts.map +1 -0
  5. package/dist/cjs/archive.js +82 -0
  6. package/dist/cjs/archive.js.map +1 -0
  7. package/dist/cjs/boss.d.ts +45 -0
  8. package/dist/cjs/boss.d.ts.map +1 -0
  9. package/dist/cjs/boss.js +205 -0
  10. package/dist/cjs/boss.js.map +1 -0
  11. package/dist/cjs/claim.d.ts +5 -0
  12. package/dist/cjs/claim.d.ts.map +1 -0
  13. package/dist/cjs/claim.js +47 -0
  14. package/dist/cjs/claim.js.map +1 -0
  15. package/dist/cjs/connection.d.ts +4 -0
  16. package/dist/cjs/connection.d.ts.map +1 -0
  17. package/dist/cjs/connection.js +26 -0
  18. package/dist/cjs/connection.js.map +1 -0
  19. package/dist/cjs/cron/next.d.ts +3 -0
  20. package/dist/cjs/cron/next.d.ts.map +1 -0
  21. package/dist/cjs/cron/next.js +179 -0
  22. package/dist/cjs/cron/next.js.map +1 -0
  23. package/dist/cjs/cron/parse.d.ts +11 -0
  24. package/dist/cjs/cron/parse.d.ts.map +1 -0
  25. package/dist/cjs/cron/parse.js +99 -0
  26. package/dist/cjs/cron/parse.js.map +1 -0
  27. package/dist/cjs/dlq.d.ts +11 -0
  28. package/dist/cjs/dlq.d.ts.map +1 -0
  29. package/dist/cjs/dlq.js +92 -0
  30. package/dist/cjs/dlq.js.map +1 -0
  31. package/dist/cjs/errors.d.ts +10 -0
  32. package/dist/cjs/errors.d.ts.map +1 -0
  33. package/dist/cjs/errors.js +25 -0
  34. package/dist/cjs/errors.js.map +1 -0
  35. package/dist/cjs/fail.d.ts +8 -0
  36. package/dist/cjs/fail.d.ts.map +1 -0
  37. package/dist/cjs/fail.js +19 -0
  38. package/dist/cjs/fail.js.map +1 -0
  39. package/dist/cjs/heartbeat.d.ts +4 -0
  40. package/dist/cjs/heartbeat.d.ts.map +1 -0
  41. package/dist/cjs/heartbeat.js +18 -0
  42. package/dist/cjs/heartbeat.js.map +1 -0
  43. package/dist/cjs/index.d.ts +70 -0
  44. package/dist/cjs/index.d.ts.map +1 -0
  45. package/dist/cjs/index.js +10 -0
  46. package/dist/cjs/index.js.map +1 -0
  47. package/dist/cjs/migrate.d.ts +4 -0
  48. package/dist/cjs/migrate.d.ts.map +1 -0
  49. package/dist/cjs/migrate.js +14 -0
  50. package/dist/cjs/migrate.js.map +1 -0
  51. package/dist/cjs/package.json +1 -0
  52. package/dist/cjs/retry-util.d.ts +2 -0
  53. package/dist/cjs/retry-util.d.ts.map +1 -0
  54. package/dist/cjs/retry-util.js +31 -0
  55. package/dist/cjs/retry-util.js.map +1 -0
  56. package/dist/cjs/sql.d.ts +82 -0
  57. package/dist/cjs/sql.d.ts.map +1 -0
  58. package/dist/cjs/sql.js +396 -0
  59. package/dist/cjs/sql.js.map +1 -0
  60. package/dist/cjs/sweep.d.ts +4 -0
  61. package/dist/cjs/sweep.d.ts.map +1 -0
  62. package/dist/cjs/sweep.js +46 -0
  63. package/dist/cjs/sweep.js.map +1 -0
  64. package/dist/cjs/tick.d.ts +11 -0
  65. package/dist/cjs/tick.d.ts.map +1 -0
  66. package/dist/cjs/tick.js +82 -0
  67. package/dist/cjs/tick.js.map +1 -0
  68. package/dist/cjs/util.d.ts +2 -0
  69. package/dist/cjs/util.d.ts.map +1 -0
  70. package/dist/cjs/util.js +7 -0
  71. package/dist/cjs/util.js.map +1 -0
  72. package/dist/cjs/worker.d.ts +42 -0
  73. package/dist/cjs/worker.d.ts.map +1 -0
  74. package/dist/cjs/worker.js +232 -0
  75. package/dist/cjs/worker.js.map +1 -0
  76. package/dist/esm/archive.d.ts +8 -0
  77. package/dist/esm/archive.d.ts.map +1 -0
  78. package/dist/esm/archive.js +76 -0
  79. package/dist/esm/archive.js.map +1 -0
  80. package/dist/esm/boss.d.ts +45 -0
  81. package/dist/esm/boss.d.ts.map +1 -0
  82. package/dist/esm/boss.js +201 -0
  83. package/dist/esm/boss.js.map +1 -0
  84. package/dist/esm/claim.d.ts +5 -0
  85. package/dist/esm/claim.d.ts.map +1 -0
  86. package/dist/esm/claim.js +44 -0
  87. package/dist/esm/claim.js.map +1 -0
  88. package/dist/esm/connection.d.ts +4 -0
  89. package/dist/esm/connection.d.ts.map +1 -0
  90. package/dist/esm/connection.js +22 -0
  91. package/dist/esm/connection.js.map +1 -0
  92. package/dist/esm/cron/next.d.ts +3 -0
  93. package/dist/esm/cron/next.d.ts.map +1 -0
  94. package/dist/esm/cron/next.js +176 -0
  95. package/dist/esm/cron/next.js.map +1 -0
  96. package/dist/esm/cron/parse.d.ts +11 -0
  97. package/dist/esm/cron/parse.d.ts.map +1 -0
  98. package/dist/esm/cron/parse.js +96 -0
  99. package/dist/esm/cron/parse.js.map +1 -0
  100. package/dist/esm/dlq.d.ts +11 -0
  101. package/dist/esm/dlq.d.ts.map +1 -0
  102. package/dist/esm/dlq.js +87 -0
  103. package/dist/esm/dlq.js.map +1 -0
  104. package/dist/esm/errors.d.ts +10 -0
  105. package/dist/esm/errors.d.ts.map +1 -0
  106. package/dist/esm/errors.js +19 -0
  107. package/dist/esm/errors.js.map +1 -0
  108. package/dist/esm/fail.d.ts +8 -0
  109. package/dist/esm/fail.d.ts.map +1 -0
  110. package/dist/esm/fail.js +16 -0
  111. package/dist/esm/fail.js.map +1 -0
  112. package/dist/esm/heartbeat.d.ts +4 -0
  113. package/dist/esm/heartbeat.d.ts.map +1 -0
  114. package/dist/esm/heartbeat.js +15 -0
  115. package/dist/esm/heartbeat.js.map +1 -0
  116. package/dist/esm/index.d.ts +70 -0
  117. package/dist/esm/index.d.ts.map +1 -0
  118. package/dist/esm/index.js +3 -0
  119. package/dist/esm/index.js.map +1 -0
  120. package/dist/esm/migrate.d.ts +4 -0
  121. package/dist/esm/migrate.d.ts.map +1 -0
  122. package/dist/esm/migrate.js +11 -0
  123. package/dist/esm/migrate.js.map +1 -0
  124. package/dist/esm/retry-util.d.ts +2 -0
  125. package/dist/esm/retry-util.d.ts.map +1 -0
  126. package/dist/esm/retry-util.js +28 -0
  127. package/dist/esm/retry-util.js.map +1 -0
  128. package/dist/esm/sql.d.ts +82 -0
  129. package/dist/esm/sql.d.ts.map +1 -0
  130. package/dist/esm/sql.js +392 -0
  131. package/dist/esm/sql.js.map +1 -0
  132. package/dist/esm/sweep.d.ts +4 -0
  133. package/dist/esm/sweep.d.ts.map +1 -0
  134. package/dist/esm/sweep.js +43 -0
  135. package/dist/esm/sweep.js.map +1 -0
  136. package/dist/esm/tick.d.ts +11 -0
  137. package/dist/esm/tick.d.ts.map +1 -0
  138. package/dist/esm/tick.js +77 -0
  139. package/dist/esm/tick.js.map +1 -0
  140. package/dist/esm/util.d.ts +2 -0
  141. package/dist/esm/util.d.ts.map +1 -0
  142. package/dist/esm/util.js +4 -0
  143. package/dist/esm/util.js.map +1 -0
  144. package/dist/esm/worker.d.ts +42 -0
  145. package/dist/esm/worker.d.ts.map +1 -0
  146. package/dist/esm/worker.js +228 -0
  147. package/dist/esm/worker.js.map +1 -0
  148. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cron/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CronFields {
2
+ minutes: Set<number>;
3
+ hours: Set<number>;
4
+ daysOfMonth: Set<number>;
5
+ months: Set<number>;
6
+ daysOfWeek: Set<number>;
7
+ hasDom: boolean;
8
+ hasDow: boolean;
9
+ }
10
+ export declare function parseCron(expression: string): CronFields;
11
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cron/parse.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CAChB;AA0FD,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAmBxD"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseCron = parseCron;
4
+ const MONTH_NAMES = {
5
+ jan: 1,
6
+ feb: 2,
7
+ mar: 3,
8
+ apr: 4,
9
+ may: 5,
10
+ jun: 6,
11
+ jul: 7,
12
+ aug: 8,
13
+ sep: 9,
14
+ oct: 10,
15
+ nov: 11,
16
+ dec: 12,
17
+ };
18
+ const DOW_NAMES = {
19
+ sun: 0,
20
+ mon: 1,
21
+ tue: 2,
22
+ wed: 3,
23
+ thu: 4,
24
+ fri: 5,
25
+ sat: 6,
26
+ };
27
+ function parseField(field, min, max, names) {
28
+ const result = new Set();
29
+ for (const part of field.split(",")) {
30
+ const stepParts = part.split("/");
31
+ const step = stepParts.length > 1 ? Number.parseInt(stepParts[1], 10) : 1;
32
+ if (Number.isNaN(step) || step < 1) {
33
+ throw new Error(`Invalid step in cron field: ${part}`);
34
+ }
35
+ const rangePart = stepParts[0];
36
+ if (rangePart === "*") {
37
+ for (let i = min; i <= max; i += step) {
38
+ result.add(i);
39
+ }
40
+ continue;
41
+ }
42
+ const resolve = (val) => {
43
+ if (names) {
44
+ const lower = val.toLowerCase();
45
+ if (lower in names)
46
+ return names[lower];
47
+ }
48
+ const n = Number.parseInt(val, 10);
49
+ if (Number.isNaN(n) || n < min || n > max) {
50
+ throw new Error(`Value out of range [${min}-${max}]: ${val}`);
51
+ }
52
+ return n;
53
+ };
54
+ if (rangePart.includes("-")) {
55
+ const [startStr, endStr] = rangePart.split("-");
56
+ const start = resolve(startStr);
57
+ const end = resolve(endStr);
58
+ if (start > end) {
59
+ // Wrap-around for dow
60
+ for (let i = start; i <= max; i += step)
61
+ result.add(i);
62
+ for (let i = min; i <= end; i += step)
63
+ result.add(i);
64
+ }
65
+ else {
66
+ for (let i = start; i <= end; i += step)
67
+ result.add(i);
68
+ }
69
+ }
70
+ else {
71
+ result.add(resolve(rangePart));
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+ function normalizeDow(set) {
77
+ if (set.has(7)) {
78
+ set.add(0);
79
+ set.delete(7);
80
+ }
81
+ return set;
82
+ }
83
+ function parseCron(expression) {
84
+ const parts = expression.trim().split(/\s+/);
85
+ if (parts.length !== 5) {
86
+ throw new Error(`Cron expression must have exactly 5 fields, got ${parts.length}: "${expression}"`);
87
+ }
88
+ const [minStr, hourStr, domStr, monStr, dowStr] = parts;
89
+ return {
90
+ minutes: parseField(minStr, 0, 59),
91
+ hours: parseField(hourStr, 0, 23),
92
+ daysOfMonth: parseField(domStr, 1, 31, undefined),
93
+ months: parseField(monStr, 1, 12, MONTH_NAMES),
94
+ daysOfWeek: normalizeDow(parseField(dowStr, 0, 7, DOW_NAMES)),
95
+ hasDom: domStr !== "*",
96
+ hasDow: dowStr !== "*",
97
+ };
98
+ }
99
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/cron/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Pool } from "mysql2/promise";
2
+ import type { DeadJob } from "./index.js";
3
+ import { type SqlStatements } from "./sql.js";
4
+ export declare function deadLetterJob(pool: Pool, jobId: string, workerId: string, error: {
5
+ message: string;
6
+ stack?: string;
7
+ at: string;
8
+ }, sql?: SqlStatements): Promise<boolean>;
9
+ export declare function listDead(pool: Pool, queue: string, before: Date, after: Date, limit: number, offset: number, sql?: SqlStatements): Promise<DeadJob[]>;
10
+ export declare function replayDead(pool: Pool, ids: string[], sql?: SqlStatements): Promise<number>;
11
+ //# sourceMappingURL=dlq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlq.d.ts","sourceRoot":"","sources":["../../src/dlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAkC,MAAM,gBAAgB,CAAC;AAG3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,UAAU,CAAC;AAG9D,wBAAsB,aAAa,CAClC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACtD,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAaD,wBAAsB,QAAQ,CAC7B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,OAAO,EAAE,CAAC,CAoBpB;AAID,wBAAsB,UAAU,CAC/B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EAAE,EACb,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deadLetterJob = deadLetterJob;
4
+ exports.listDead = listDead;
5
+ exports.replayDead = replayDead;
6
+ const connection_js_1 = require("./connection.js");
7
+ const errors_js_1 = require("./errors.js");
8
+ const retry_util_js_1 = require("./retry-util.js");
9
+ const sql_js_1 = require("./sql.js");
10
+ const util_js_1 = require("./util.js");
11
+ async function deadLetterJob(pool, jobId, workerId, error, sql = sql_js_1.UNPREFIXED_SQL) {
12
+ return (0, retry_util_js_1.withDeadlockRetry)(async () => {
13
+ const conn = await (0, connection_js_1.acquireConnection)(pool);
14
+ try {
15
+ await conn.beginTransaction();
16
+ const [result] = await conn.query(sql.DLQ_INSERT, [
17
+ JSON.stringify(error),
18
+ jobId,
19
+ workerId,
20
+ ]);
21
+ if (result.affectedRows === 0) {
22
+ await conn.commit();
23
+ return false;
24
+ }
25
+ await conn.query(sql.DLQ_DELETE, [jobId, workerId]);
26
+ await conn.commit();
27
+ return true;
28
+ }
29
+ catch (err) {
30
+ await conn.rollback().catch(() => { });
31
+ throw err;
32
+ }
33
+ finally {
34
+ conn.release();
35
+ }
36
+ });
37
+ }
38
+ async function listDead(pool, queue, before, after, limit, offset, sql = sql_js_1.UNPREFIXED_SQL) {
39
+ return (0, connection_js_1.withConnection)(pool, async (connection) => {
40
+ const [rows] = await connection.query(sql.LIST_DEAD, [
41
+ queue,
42
+ (0, util_js_1.toUtcString)(after),
43
+ (0, util_js_1.toUtcString)(before),
44
+ limit,
45
+ offset,
46
+ ]);
47
+ return rows.map((r) => ({
48
+ id: r.id,
49
+ queue: r.queue,
50
+ payload: r.payload,
51
+ priority: r.priority,
52
+ retryCount: r.retry_count,
53
+ createdAt: new Date(Number(r.created_at_unix) * 1000),
54
+ failedAt: new Date(Number(r.failed_at_unix) * 1000),
55
+ lastError: r.last_error,
56
+ }));
57
+ });
58
+ }
59
+ const ER_DUP_ENTRY = 1062;
60
+ async function replayDead(pool, ids, sql = sql_js_1.UNPREFIXED_SQL) {
61
+ return (0, retry_util_js_1.withDeadlockRetry)(async () => {
62
+ const conn = await (0, connection_js_1.acquireConnection)(pool);
63
+ try {
64
+ await conn.beginTransaction();
65
+ try {
66
+ const bigIds = ids.map(BigInt);
67
+ const [result] = await conn.query(sql.REPLAY_INSERT, [
68
+ bigIds,
69
+ ]);
70
+ if (result.affectedRows > 0) {
71
+ await conn.query(sql.REPLAY_DELETE, [bigIds]);
72
+ }
73
+ await conn.commit();
74
+ return result.affectedRows;
75
+ }
76
+ catch (err) {
77
+ await conn.rollback();
78
+ if (typeof err === "object" &&
79
+ err !== null &&
80
+ "errno" in err &&
81
+ err.errno === ER_DUP_ENTRY) {
82
+ throw new errors_js_1.SingletonCollisionError("Replay collides with a live singleton job");
83
+ }
84
+ throw err;
85
+ }
86
+ }
87
+ finally {
88
+ conn.release();
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=dlq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlq.js","sourceRoot":"","sources":["../../src/dlq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class ConfigError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class ValidationError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare class SingletonCollisionError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;IACrC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingletonCollisionError = exports.ValidationError = exports.ConfigError = void 0;
4
+ class ConfigError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "ConfigError";
8
+ }
9
+ }
10
+ exports.ConfigError = ConfigError;
11
+ class ValidationError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "ValidationError";
15
+ }
16
+ }
17
+ exports.ValidationError = ValidationError;
18
+ class SingletonCollisionError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = "SingletonCollisionError";
22
+ }
23
+ }
24
+ exports.SingletonCollisionError = SingletonCollisionError;
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,iBAAyB,SAAQ,KAAK;IACrC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC3B,CAAC;CACD;;AAED,qBAA6B,SAAQ,KAAK;IACzC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;;AAED,6BAAqC,SAAQ,KAAK;IACjD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACvC,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ import type { Pool } from "mysql2/promise";
2
+ import { type SqlStatements } from "./sql.js";
3
+ export declare function failJob(pool: Pool, jobId: string, workerId: string, error: {
4
+ message: string;
5
+ stack?: string;
6
+ at: string;
7
+ }, sql?: SqlStatements): Promise<boolean>;
8
+ //# sourceMappingURL=fail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.d.ts","sourceRoot":"","sources":["../../src/fail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,gBAAgB,CAAC;AAG5D,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,UAAU,CAAC;AAE9D,wBAAsB,OAAO,CAC5B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACtD,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,OAAO,CAAC,CAWlB"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.failJob = failJob;
4
+ const connection_js_1 = require("./connection.js");
5
+ const retry_util_js_1 = require("./retry-util.js");
6
+ const sql_js_1 = require("./sql.js");
7
+ async function failJob(pool, jobId, workerId, error, sql = sql_js_1.UNPREFIXED_SQL) {
8
+ return (0, retry_util_js_1.withDeadlockRetry)(async () => {
9
+ return (0, connection_js_1.withConnection)(pool, async (connection) => {
10
+ const [result] = await connection.query(sql.FAIL_RETRY, [
11
+ JSON.stringify(error),
12
+ jobId,
13
+ workerId,
14
+ ]);
15
+ return result.affectedRows > 0;
16
+ });
17
+ });
18
+ }
19
+ //# sourceMappingURL=fail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.js","sourceRoot":"","sources":["../../src/fail.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,mDAAoD;AACpD,qCAA8D;AAEvD,KAAK,kBACX,IAAU,EACV,KAAa,EACb,QAAgB,EAChB,KAAsD,EACtD,GAAG,GAAkB,uBAAc;IAEnC,OAAO,IAAA,iCAAiB,EAAC,KAAK,IAAI,EAAE;QACnC,OAAO,IAAA,8BAAc,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAChD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAkB,GAAG,CAAC,UAAU,EAAE;gBACxE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBACrB,KAAK;gBACL,QAAQ;aACR,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Pool } from "mysql2/promise";
2
+ import { type SqlStatements } from "./sql.js";
3
+ export declare function heartbeatOwnedJobs(pool: Pool, jobIds: bigint[], workerId: string, leaseSeconds: number, sql?: SqlStatements): Promise<Set<string>>;
4
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAiB,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,UAAU,CAAC;AAM9D,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAUtB"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.heartbeatOwnedJobs = heartbeatOwnedJobs;
4
+ const connection_js_1 = require("./connection.js");
5
+ const sql_js_1 = require("./sql.js");
6
+ async function heartbeatOwnedJobs(pool, jobIds, workerId, leaseSeconds, sql = sql_js_1.UNPREFIXED_SQL) {
7
+ if (jobIds.length === 0)
8
+ return new Set();
9
+ return (0, connection_js_1.withConnection)(pool, async (connection) => {
10
+ await connection.query(sql.HEARTBEAT, [leaseSeconds, jobIds, workerId]);
11
+ const [rows] = await connection.query(sql.HEARTBEAT_OWNED, [
12
+ jobIds,
13
+ workerId,
14
+ ]);
15
+ return new Set(rows.map((row) => row.id));
16
+ });
17
+ }
18
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,qCAA8D;AAMvD,KAAK,6BACX,IAAU,EACV,MAAgB,EAChB,QAAgB,EAChB,YAAoB,EACpB,GAAG,GAAkB,uBAAc;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC1C,OAAO,IAAA,8BAAc,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAChD,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAa,GAAG,CAAC,eAAe,EAAE;YACtE,MAAM;YACN,QAAQ;SACR,CAAC,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { Pool } from "mysql2/promise";
2
+ export interface MysqlBossOptions {
3
+ pool: Pool;
4
+ /**
5
+ * Prefix for all queue tables. Defaults to "mysql_boss", producing
6
+ * mysql_boss_jobs, mysql_boss_jobs_archive, mysql_boss_jobs_dead, and
7
+ * mysql_boss_schedules. Set to "" to use the legacy unprefixed names.
8
+ */
9
+ tablePrefix?: string;
10
+ pollIntervalMs?: number;
11
+ batchSize?: number;
12
+ concurrency?: number;
13
+ leaseSeconds?: number;
14
+ heartbeatSeconds?: number;
15
+ sweepIntervalMs?: number;
16
+ tickIntervalMs?: number;
17
+ archiveRetentionDays?: number;
18
+ drainTimeoutMs?: number;
19
+ onError?: (err: unknown, context: string) => void;
20
+ }
21
+ export interface EnqueueOptions {
22
+ priority?: number;
23
+ singletonKey?: string;
24
+ retryLimit?: number;
25
+ retryDelaySecs?: number;
26
+ retryBackoff?: boolean;
27
+ runAt?: Date;
28
+ }
29
+ export interface ActiveJob<T = unknown> {
30
+ id: string;
31
+ queue: string;
32
+ payload: T;
33
+ retryCount: number;
34
+ retryLimit: number;
35
+ }
36
+ export type JobHandler<T = unknown> = (job: ActiveJob<T>, ctx: {
37
+ signal: AbortSignal;
38
+ }) => Promise<void>;
39
+ export interface DeadJob<T = unknown> {
40
+ id: string;
41
+ queue: string;
42
+ payload: T;
43
+ priority: number;
44
+ retryCount: number;
45
+ createdAt: Date;
46
+ failedAt: Date;
47
+ lastError: {
48
+ message: string;
49
+ stack?: string;
50
+ at: string;
51
+ } | null;
52
+ }
53
+ export interface ArchivedJob<T = unknown> {
54
+ id: string;
55
+ queue: string;
56
+ payload: T;
57
+ priority: number;
58
+ retryCount: number;
59
+ createdAt: Date;
60
+ startedAt: Date;
61
+ completedAt: Date;
62
+ durationMs: number;
63
+ }
64
+ export interface ScheduleOptions extends Omit<EnqueueOptions, "singletonKey" | "runAt"> {
65
+ timezone?: string;
66
+ payload?: unknown;
67
+ }
68
+ export { MysqlBoss } from "./boss.js";
69
+ export { ConfigError, ValidationError, SingletonCollisionError, } from "./errors.js";
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,IAAI,CAAC;IACX;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CACrC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EACjB,GAAG,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,KACxB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAChB,SAAQ,IAAI,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACN,WAAW,EACX,eAAe,EACf,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingletonCollisionError = exports.ValidationError = exports.ConfigError = exports.MysqlBoss = void 0;
4
+ var boss_js_1 = require("./boss.js");
5
+ Object.defineProperty(exports, "MysqlBoss", { enumerable: true, get: function () { return boss_js_1.MysqlBoss; } });
6
+ var errors_js_1 = require("./errors.js");
7
+ Object.defineProperty(exports, "ConfigError", { enumerable: true, get: function () { return errors_js_1.ConfigError; } });
8
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_js_1.ValidationError; } });
9
+ Object.defineProperty(exports, "SingletonCollisionError", { enumerable: true, get: function () { return errors_js_1.SingletonCollisionError; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAyEA,qCAAsC;AAA7B,oGAAA,SAAS,OAAA;AAClB,yCAIqB;AAHpB,wGAAA,WAAW,OAAA;AACX,4GAAA,eAAe,OAAA;AACf,oHAAA,uBAAuB,OAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Pool } from "mysql2/promise";
2
+ import { type SqlStatements } from "./sql.js";
3
+ export declare function migrate(pool: Pool, sql?: SqlStatements): Promise<void>;
4
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,UAAU,CAAC;AAE9D,wBAAsB,OAAO,CAC5B,IAAI,EAAE,IAAI,EACV,GAAG,GAAE,aAA8B,GACjC,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrate = migrate;
4
+ const connection_js_1 = require("./connection.js");
5
+ const sql_js_1 = require("./sql.js");
6
+ async function migrate(pool, sql = sql_js_1.UNPREFIXED_SQL) {
7
+ await (0, connection_js_1.withConnection)(pool, async (connection) => {
8
+ await connection.query(sql.CREATE_JOBS);
9
+ await connection.query(sql.CREATE_JOBS_ARCHIVE);
10
+ await connection.query(sql.CREATE_JOBS_DEAD);
11
+ await connection.query(sql.CREATE_SCHEDULES);
12
+ });
13
+ }
14
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,qCAA8D;AAEvD,KAAK,kBACX,IAAU,EACV,GAAG,GAAkB,uBAAc;IAEnC,MAAM,IAAA,8BAAc,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAC/C,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,2 @@
1
+ export declare function withDeadlockRetry<T>(fn: () => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=retry-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-util.d.ts","sourceRoot":"","sources":["../../src/retry-util.ts"],"names":[],"mappings":"AAYA,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAe3E"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withDeadlockRetry = withDeadlockRetry;
4
+ const ER_LOCK_DEADLOCK = 1213;
5
+ const ER_LOCK_WAIT_TIMEOUT = 1205;
6
+ const MAX_RETRIES = 3;
7
+ function isRetryable(err) {
8
+ if (typeof err === "object" && err !== null && "errno" in err) {
9
+ const errno = err.errno;
10
+ return errno === ER_LOCK_DEADLOCK || errno === ER_LOCK_WAIT_TIMEOUT;
11
+ }
12
+ return false;
13
+ }
14
+ async function withDeadlockRetry(fn) {
15
+ let lastErr;
16
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
17
+ try {
18
+ return await fn();
19
+ }
20
+ catch (err) {
21
+ lastErr = err;
22
+ if (!isRetryable(err) || attempt === MAX_RETRIES - 1) {
23
+ throw err;
24
+ }
25
+ const jitter = Math.random() * 50 * (attempt + 1);
26
+ await new Promise((resolve) => setTimeout(resolve, jitter));
27
+ }
28
+ }
29
+ throw lastErr;
30
+ }
31
+ //# sourceMappingURL=retry-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-util.js","sourceRoot":"","sources":["../../src/retry-util.ts"],"names":[],"mappings":";;;AAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,WAAW,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAI,GAAyB,CAAC,KAAK,CAAC;QAC/C,OAAO,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,oBAAoB,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAEM,KAAK,4BAA+B,EAAoB;IAC9D,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACJ,OAAO,MAAM,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,GAAG,GAAG,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,GAAG,CAAC;YACX,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IACD,MAAM,OAAO,CAAC;AACf,CAAC"}