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,87 @@
1
+ import { acquireConnection, withConnection } from "./connection.js";
2
+ import { SingletonCollisionError } from "./errors.js";
3
+ import { withDeadlockRetry } from "./retry-util.js";
4
+ import { UNPREFIXED_SQL } from "./sql.js";
5
+ import { toUtcString } from "./util.js";
6
+ export async function deadLetterJob(pool, jobId, workerId, error, sql = UNPREFIXED_SQL) {
7
+ return withDeadlockRetry(async () => {
8
+ const conn = await acquireConnection(pool);
9
+ try {
10
+ await conn.beginTransaction();
11
+ const [result] = await conn.query(sql.DLQ_INSERT, [
12
+ JSON.stringify(error),
13
+ jobId,
14
+ workerId,
15
+ ]);
16
+ if (result.affectedRows === 0) {
17
+ await conn.commit();
18
+ return false;
19
+ }
20
+ await conn.query(sql.DLQ_DELETE, [jobId, workerId]);
21
+ await conn.commit();
22
+ return true;
23
+ }
24
+ catch (err) {
25
+ await conn.rollback().catch(() => { });
26
+ throw err;
27
+ }
28
+ finally {
29
+ conn.release();
30
+ }
31
+ });
32
+ }
33
+ export async function listDead(pool, queue, before, after, limit, offset, sql = UNPREFIXED_SQL) {
34
+ return withConnection(pool, async (connection) => {
35
+ const [rows] = await connection.query(sql.LIST_DEAD, [
36
+ queue,
37
+ toUtcString(after),
38
+ toUtcString(before),
39
+ limit,
40
+ offset,
41
+ ]);
42
+ return rows.map((r) => ({
43
+ id: r.id,
44
+ queue: r.queue,
45
+ payload: r.payload,
46
+ priority: r.priority,
47
+ retryCount: r.retry_count,
48
+ createdAt: new Date(Number(r.created_at_unix) * 1000),
49
+ failedAt: new Date(Number(r.failed_at_unix) * 1000),
50
+ lastError: r.last_error,
51
+ }));
52
+ });
53
+ }
54
+ const ER_DUP_ENTRY = 1062;
55
+ export async function replayDead(pool, ids, sql = UNPREFIXED_SQL) {
56
+ return withDeadlockRetry(async () => {
57
+ const conn = await acquireConnection(pool);
58
+ try {
59
+ await conn.beginTransaction();
60
+ try {
61
+ const bigIds = ids.map(BigInt);
62
+ const [result] = await conn.query(sql.REPLAY_INSERT, [
63
+ bigIds,
64
+ ]);
65
+ if (result.affectedRows > 0) {
66
+ await conn.query(sql.REPLAY_DELETE, [bigIds]);
67
+ }
68
+ await conn.commit();
69
+ return result.affectedRows;
70
+ }
71
+ catch (err) {
72
+ await conn.rollback();
73
+ if (typeof err === "object" &&
74
+ err !== null &&
75
+ "errno" in err &&
76
+ err.errno === ER_DUP_ENTRY) {
77
+ throw new SingletonCollisionError("Replay collides with a live singleton job");
78
+ }
79
+ throw err;
80
+ }
81
+ }
82
+ finally {
83
+ conn.release();
84
+ }
85
+ });
86
+ }
87
+ //# sourceMappingURL=dlq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlq.js","sourceRoot":"","sources":["../../src/dlq.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAsB,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,IAAU,EACV,KAAa,EACb,QAAgB,EAChB,KAAsD,EACtD,GAAG,GAAkB,cAAc;IAEnC,OAAO,iBAAiB,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE9B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAkB,GAAG,CAAC,UAAU,EAAE;gBAClE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBACrB,KAAK;gBACL,QAAQ;aACR,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC;QACX,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,IAAU,EACV,KAAa,EACb,MAAY,EACZ,KAAW,EACX,KAAa,EACb,MAAc,EACd,GAAG,GAAkB,cAAc;IAEnC,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAChD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAY,GAAG,CAAC,SAAS,EAAE;YAC/D,KAAK;YACL,WAAW,CAAC,KAAK,CAAC;YAClB,WAAW,CAAC,MAAM,CAAC;YACnB,KAAK;YACL,MAAM;SACN,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;YACrD,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;YACnD,SAAS,EAAE,CAAC,CAAC,UAAU;SACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,IAAU,EACV,GAAa,EACb,GAAG,GAAkB,cAAc;IAEnC,OAAO,iBAAiB,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE9B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAkB,GAAG,CAAC,aAAa,EAAE;oBACrE,MAAM;iBACN,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,CAAC;gBAED,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAC,YAAY,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,IACC,OAAO,GAAG,KAAK,QAAQ;oBACvB,GAAG,KAAK,IAAI;oBACZ,OAAO,IAAI,GAAG;oBACb,GAAyB,CAAC,KAAK,KAAK,YAAY,EAChD,CAAC;oBACF,MAAM,IAAI,uBAAuB,CAChC,2CAA2C,CAC3C,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -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,19 @@
1
+ export class ConfigError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "ConfigError";
5
+ }
6
+ }
7
+ export class ValidationError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "ValidationError";
11
+ }
12
+ }
13
+ export class SingletonCollisionError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "SingletonCollisionError";
17
+ }
18
+ }
19
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACrC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC3B,CAAC;CACD;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACzC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;AAED,MAAM,OAAO,uBAAwB,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,16 @@
1
+ import { withConnection } from "./connection.js";
2
+ import { withDeadlockRetry } from "./retry-util.js";
3
+ import { UNPREFIXED_SQL } from "./sql.js";
4
+ export async function failJob(pool, jobId, workerId, error, sql = UNPREFIXED_SQL) {
5
+ return withDeadlockRetry(async () => {
6
+ return withConnection(pool, async (connection) => {
7
+ const [result] = await connection.query(sql.FAIL_RETRY, [
8
+ JSON.stringify(error),
9
+ jobId,
10
+ workerId,
11
+ ]);
12
+ return result.affectedRows > 0;
13
+ });
14
+ });
15
+ }
16
+ //# sourceMappingURL=fail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.js","sourceRoot":"","sources":["../../src/fail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAsB,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,IAAU,EACV,KAAa,EACb,QAAgB,EAChB,KAAsD,EACtD,GAAG,GAAkB,cAAc;IAEnC,OAAO,iBAAiB,CAAC,KAAK,IAAI,EAAE;QACnC,OAAO,cAAc,CAAC,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,15 @@
1
+ import { withConnection } from "./connection.js";
2
+ import { UNPREFIXED_SQL } from "./sql.js";
3
+ export async function heartbeatOwnedJobs(pool, jobIds, workerId, leaseSeconds, sql = UNPREFIXED_SQL) {
4
+ if (jobIds.length === 0)
5
+ return new Set();
6
+ return withConnection(pool, async (connection) => {
7
+ await connection.query(sql.HEARTBEAT, [leaseSeconds, jobIds, workerId]);
8
+ const [rows] = await connection.query(sql.HEARTBEAT_OWNED, [
9
+ jobIds,
10
+ workerId,
11
+ ]);
12
+ return new Set(rows.map((row) => row.id));
13
+ });
14
+ }
15
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAsB,cAAc,EAAE,MAAM,UAAU,CAAC;AAM9D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,IAAU,EACV,MAAgB,EAChB,QAAgB,EAChB,YAAoB,EACpB,GAAG,GAAkB,cAAc;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC1C,OAAO,cAAc,CAAC,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,3 @@
1
+ export { MysqlBoss } from "./boss.js";
2
+ export { ConfigError, ValidationError, SingletonCollisionError, } from "./errors.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAyEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACN,WAAW,EACX,eAAe,EACf,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
@@ -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,11 @@
1
+ import { withConnection } from "./connection.js";
2
+ import { UNPREFIXED_SQL } from "./sql.js";
3
+ export async function migrate(pool, sql = UNPREFIXED_SQL) {
4
+ await withConnection(pool, async (connection) => {
5
+ await connection.query(sql.CREATE_JOBS);
6
+ await connection.query(sql.CREATE_JOBS_ARCHIVE);
7
+ await connection.query(sql.CREATE_JOBS_DEAD);
8
+ await connection.query(sql.CREATE_SCHEDULES);
9
+ });
10
+ }
11
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAsB,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,IAAU,EACV,GAAG,GAAkB,cAAc;IAEnC,MAAM,cAAc,CAAC,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,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,28 @@
1
+ const ER_LOCK_DEADLOCK = 1213;
2
+ const ER_LOCK_WAIT_TIMEOUT = 1205;
3
+ const MAX_RETRIES = 3;
4
+ function isRetryable(err) {
5
+ if (typeof err === "object" && err !== null && "errno" in err) {
6
+ const errno = err.errno;
7
+ return errno === ER_LOCK_DEADLOCK || errno === ER_LOCK_WAIT_TIMEOUT;
8
+ }
9
+ return false;
10
+ }
11
+ export async function withDeadlockRetry(fn) {
12
+ let lastErr;
13
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
14
+ try {
15
+ return await fn();
16
+ }
17
+ catch (err) {
18
+ lastErr = err;
19
+ if (!isRetryable(err) || attempt === MAX_RETRIES - 1) {
20
+ throw err;
21
+ }
22
+ const jitter = Math.random() * 50 * (attempt + 1);
23
+ await new Promise((resolve) => setTimeout(resolve, jitter));
24
+ }
25
+ }
26
+ throw lastErr;
27
+ }
28
+ //# 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;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAI,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"}
@@ -0,0 +1,82 @@
1
+ export declare const CREATE_JOBS = "\nCREATE TABLE IF NOT EXISTS jobs (\n id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,\n queue VARCHAR(128) NOT NULL,\n state ENUM('available','active') NOT NULL DEFAULT 'available',\n priority SMALLINT NOT NULL DEFAULT 0,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL DEFAULT 0,\n retry_limit INT UNSIGNED NOT NULL DEFAULT 2,\n retry_delay_secs INT UNSIGNED NOT NULL DEFAULT 30,\n retry_backoff TINYINT(1) NOT NULL DEFAULT 0,\n run_at DATETIME(6) NOT NULL,\n created_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n started_at DATETIME(6) NULL,\n locked_by BINARY(16) NULL,\n lease_expires_at DATETIME(6) NULL,\n last_error JSON NULL,\n PRIMARY KEY (id),\n UNIQUE KEY uq_jobs_singleton (queue, singleton_key),\n KEY ix_jobs_dequeue (queue, state, priority DESC, run_at, id),\n KEY ix_jobs_lease (state, lease_expires_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
2
+ export declare const CREATE_JOBS_ARCHIVE = "\nCREATE TABLE IF NOT EXISTS jobs_archive (\n id BIGINT UNSIGNED NOT NULL,\n queue VARCHAR(128) NOT NULL,\n priority SMALLINT NOT NULL,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL,\n created_at DATETIME(6) NOT NULL,\n started_at DATETIME(6) NOT NULL,\n completed_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n duration_ms INT UNSIGNED NOT NULL,\n PRIMARY KEY (id),\n KEY ix_archive_queue_time (queue, completed_at),\n KEY ix_archive_time (completed_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
3
+ export declare const CREATE_JOBS_DEAD = "\nCREATE TABLE IF NOT EXISTS jobs_dead (\n id BIGINT UNSIGNED NOT NULL,\n queue VARCHAR(128) NOT NULL,\n priority SMALLINT NOT NULL,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL,\n retry_limit INT UNSIGNED NOT NULL,\n retry_delay_secs INT UNSIGNED NOT NULL,\n retry_backoff TINYINT(1) NOT NULL,\n created_at DATETIME(6) NOT NULL,\n failed_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n last_error JSON NULL,\n PRIMARY KEY (id),\n KEY ix_dead_queue_time (queue, failed_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
4
+ export declare const CREATE_SCHEDULES = "\nCREATE TABLE IF NOT EXISTS schedules (\n name VARCHAR(128) NOT NULL,\n queue VARCHAR(128) NOT NULL,\n cron VARCHAR(64) NOT NULL,\n timezone VARCHAR(64) NOT NULL DEFAULT 'UTC',\n payload JSON NULL,\n job_options JSON NULL,\n next_run_at DATETIME(6) NOT NULL,\n last_enqueued_at DATETIME(6) NULL,\n updated_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6))\n ON UPDATE CURRENT_TIMESTAMP(6),\n PRIMARY KEY (name),\n KEY ix_schedules_due (next_run_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
5
+ export declare const ENQUEUE = "\nINSERT INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, ?, ?, ?, ?, COALESCE(?, UTC_TIMESTAMP(6)));\n";
6
+ export declare const ENQUEUE_SINGLETON = "\nINSERT IGNORE INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, ?, ?, ?, ?, COALESCE(?, UTC_TIMESTAMP(6)));\n";
7
+ export declare const LAST_INSERT_ID = "\nSELECT CAST(LAST_INSERT_ID() AS CHAR) AS id;\n";
8
+ export declare const CLAIM_SELECT = "\nSELECT CAST(id AS CHAR) AS id, queue, payload, retry_count, retry_limit,\n retry_delay_secs, retry_backoff\nFROM jobs\nWHERE queue = ?\n AND state = 'available'\n AND run_at <= UTC_TIMESTAMP(6)\nORDER BY priority DESC, run_at, id\nLIMIT ?\nFOR UPDATE SKIP LOCKED;\n";
9
+ export declare const CLAIM_UPDATE = "\nUPDATE jobs\nSET state = 'active',\n started_at = UTC_TIMESTAMP(6),\n locked_by = UUID_TO_BIN(?),\n lease_expires_at = UTC_TIMESTAMP(6) + INTERVAL ? SECOND\nWHERE id IN (?);\n";
10
+ export declare const COMPLETE_ARCHIVE = "\nINSERT INTO jobs_archive\n (id, queue, priority, payload, singleton_key, retry_count,\n created_at, started_at, duration_ms)\nSELECT id, queue, priority, payload, singleton_key, retry_count,\n created_at, started_at,\n TIMESTAMPDIFF(MICROSECOND, started_at, UTC_TIMESTAMP(6)) DIV 1000\nFROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
11
+ export declare const COMPLETE_DELETE = "\nDELETE FROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
12
+ export declare const FAIL_RETRY = "\nUPDATE jobs\nSET state = 'available',\n run_at = UTC_TIMESTAMP(6) + INTERVAL\n LEAST(\n 86400,\n IF(retry_backoff = 1,\n retry_delay_secs * POW(2, retry_count),\n retry_delay_secs)\n + FLOOR(RAND() * retry_delay_secs)\n ) SECOND,\n retry_count = retry_count + 1,\n locked_by = NULL,\n lease_expires_at = NULL,\n started_at = NULL,\n last_error = ?\nWHERE id = ?\n AND locked_by = UUID_TO_BIN(?)\n AND state = 'active'\n AND retry_count < retry_limit;\n";
13
+ export declare const DLQ_INSERT = "\nINSERT INTO jobs_dead\n (id, queue, priority, payload, singleton_key,\n retry_count, retry_limit, retry_delay_secs, retry_backoff,\n created_at, last_error)\nSELECT id, queue, priority, payload, singleton_key,\n retry_count + 1, retry_limit, retry_delay_secs, retry_backoff,\n created_at, ?\nFROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
14
+ export declare const DLQ_DELETE = "\nDELETE FROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
15
+ export declare const LIST_DEAD = "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(failed_at) AS failed_at_unix,\n last_error\nFROM jobs_dead\nWHERE queue = ? AND failed_at BETWEEN ? AND ?\nORDER BY failed_at DESC\nLIMIT ? OFFSET ?;\n";
16
+ export declare const REPLAY_INSERT = "\nINSERT INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nSELECT queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, UTC_TIMESTAMP(6)\nFROM jobs_dead\nWHERE id IN (?)\nFOR UPDATE;\n";
17
+ export declare const REPLAY_DELETE = "\nDELETE FROM jobs_dead WHERE id IN (?);\n";
18
+ export declare const DB_NOW = "SELECT UNIX_TIMESTAMP(UTC_TIMESTAMP(6)) AS db_now_unix;";
19
+ export declare const TICK_SELECT = "\nSELECT name, queue, cron, timezone, payload, job_options,\n next_run_at,\n UNIX_TIMESTAMP(next_run_at) AS next_run_at_unix\nFROM schedules\nWHERE next_run_at <= UTC_TIMESTAMP(6)\nORDER BY next_run_at\nLIMIT 20\nFOR UPDATE SKIP LOCKED;\n";
20
+ export declare const TICK_ENQUEUE = "\nINSERT IGNORE INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, CONCAT('cron:', ?, ':', DATE_FORMAT(?, '%Y%m%d%H%i%s')),\n ?, ?, ?, UTC_TIMESTAMP(6));\n";
21
+ export declare const TICK_ADVANCE = "\nUPDATE schedules\nSET next_run_at = ?, last_enqueued_at = UTC_TIMESTAMP(6)\nWHERE name = ?;\n";
22
+ export declare const SCHEDULE_UPSERT = "\nINSERT INTO schedules (name, queue, cron, timezone, payload, job_options, next_run_at)\nVALUES (?, ?, ?, ?, ?, ?, ?)\nON DUPLICATE KEY UPDATE\n queue = VALUES(queue),\n cron = VALUES(cron),\n timezone = VALUES(timezone),\n payload = VALUES(payload),\n job_options = VALUES(job_options),\n next_run_at = VALUES(next_run_at);\n";
23
+ export declare const SCHEDULE_DELETE = "\nDELETE FROM schedules WHERE name = ?;\n";
24
+ export declare const HEARTBEAT = "\nUPDATE jobs\nSET lease_expires_at = UTC_TIMESTAMP(6) + INTERVAL ? SECOND\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
25
+ export declare const HEARTBEAT_OWNED = "\nSELECT CAST(id AS CHAR) AS id\nFROM jobs\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
26
+ export declare const DRAIN_RELEASE = "\nUPDATE jobs\nSET state = 'available', run_at = UTC_TIMESTAMP(6),\n locked_by = NULL, lease_expires_at = NULL, started_at = NULL\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
27
+ export declare const SWEEP_SELECT = "\nSELECT CAST(id AS CHAR) AS id, retry_count, retry_limit\nFROM jobs\nWHERE state = 'active' AND lease_expires_at < UTC_TIMESTAMP(6)\nORDER BY lease_expires_at\nLIMIT 100\nFOR UPDATE SKIP LOCKED;\n";
28
+ export declare const SWEEP_RETRY = "\nUPDATE jobs\nSET state = 'available',\n run_at = UTC_TIMESTAMP(6) + INTERVAL\n LEAST(\n 86400,\n IF(retry_backoff = 1,\n retry_delay_secs * POW(2, retry_count),\n retry_delay_secs)\n + FLOOR(RAND() * retry_delay_secs)\n ) SECOND,\n retry_count = retry_count + 1,\n locked_by = NULL, lease_expires_at = NULL, started_at = NULL,\n last_error = JSON_OBJECT('message', 'lease expired', 'at', UTC_TIMESTAMP(6))\nWHERE id IN (?) AND retry_count < retry_limit;\n";
29
+ export declare const SWEEP_DLQ_INSERT = "\nINSERT INTO jobs_dead\n (id, queue, priority, payload, singleton_key,\n retry_count, retry_limit, retry_delay_secs, retry_backoff,\n created_at, last_error)\nSELECT id, queue, priority, payload, singleton_key,\n retry_count + 1, retry_limit, retry_delay_secs, retry_backoff,\n created_at, JSON_OBJECT('message', 'lease expired', 'at', UTC_TIMESTAMP(6))\nFROM jobs\nWHERE id IN (?);\n";
30
+ export declare const SWEEP_DLQ_DELETE = "\nDELETE FROM jobs WHERE id IN (?);\n";
31
+ export declare const ARCHIVE_PRUNE = "\nDELETE FROM jobs_archive\nWHERE completed_at < UTC_TIMESTAMP(6) - INTERVAL ? DAY\nORDER BY completed_at\nLIMIT 5000;\n";
32
+ export declare const GET_ARCHIVED_JOB = "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, singleton_key, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(started_at) AS started_at_unix,\n UNIX_TIMESTAMP(completed_at) AS completed_at_unix,\n duration_ms\nFROM jobs_archive\nWHERE id = ?;\n";
33
+ export declare const LIST_ARCHIVE = "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, singleton_key, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(started_at) AS started_at_unix,\n UNIX_TIMESTAMP(completed_at) AS completed_at_unix,\n duration_ms\nFROM jobs_archive\nWHERE queue = ? AND completed_at < ?\nORDER BY completed_at DESC\nLIMIT ?;\n";
34
+ export declare const INIT_SESSION = "\nSET SESSION transaction_isolation = 'READ-COMMITTED',\n SESSION time_zone = '+00:00';\n";
35
+ export declare const DEFAULT_TABLE_PREFIX = "mysql_boss";
36
+ export declare const UNPREFIXED_SQL: {
37
+ readonly CREATE_JOBS: "\nCREATE TABLE IF NOT EXISTS jobs (\n id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,\n queue VARCHAR(128) NOT NULL,\n state ENUM('available','active') NOT NULL DEFAULT 'available',\n priority SMALLINT NOT NULL DEFAULT 0,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL DEFAULT 0,\n retry_limit INT UNSIGNED NOT NULL DEFAULT 2,\n retry_delay_secs INT UNSIGNED NOT NULL DEFAULT 30,\n retry_backoff TINYINT(1) NOT NULL DEFAULT 0,\n run_at DATETIME(6) NOT NULL,\n created_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n started_at DATETIME(6) NULL,\n locked_by BINARY(16) NULL,\n lease_expires_at DATETIME(6) NULL,\n last_error JSON NULL,\n PRIMARY KEY (id),\n UNIQUE KEY uq_jobs_singleton (queue, singleton_key),\n KEY ix_jobs_dequeue (queue, state, priority DESC, run_at, id),\n KEY ix_jobs_lease (state, lease_expires_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
38
+ readonly CREATE_JOBS_ARCHIVE: "\nCREATE TABLE IF NOT EXISTS jobs_archive (\n id BIGINT UNSIGNED NOT NULL,\n queue VARCHAR(128) NOT NULL,\n priority SMALLINT NOT NULL,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL,\n created_at DATETIME(6) NOT NULL,\n started_at DATETIME(6) NOT NULL,\n completed_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n duration_ms INT UNSIGNED NOT NULL,\n PRIMARY KEY (id),\n KEY ix_archive_queue_time (queue, completed_at),\n KEY ix_archive_time (completed_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
39
+ readonly CREATE_JOBS_DEAD: "\nCREATE TABLE IF NOT EXISTS jobs_dead (\n id BIGINT UNSIGNED NOT NULL,\n queue VARCHAR(128) NOT NULL,\n priority SMALLINT NOT NULL,\n payload JSON NULL,\n singleton_key VARCHAR(191) NULL,\n retry_count INT UNSIGNED NOT NULL,\n retry_limit INT UNSIGNED NOT NULL,\n retry_delay_secs INT UNSIGNED NOT NULL,\n retry_backoff TINYINT(1) NOT NULL,\n created_at DATETIME(6) NOT NULL,\n failed_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6)),\n last_error JSON NULL,\n PRIMARY KEY (id),\n KEY ix_dead_queue_time (queue, failed_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
40
+ readonly CREATE_SCHEDULES: "\nCREATE TABLE IF NOT EXISTS schedules (\n name VARCHAR(128) NOT NULL,\n queue VARCHAR(128) NOT NULL,\n cron VARCHAR(64) NOT NULL,\n timezone VARCHAR(64) NOT NULL DEFAULT 'UTC',\n payload JSON NULL,\n job_options JSON NULL,\n next_run_at DATETIME(6) NOT NULL,\n last_enqueued_at DATETIME(6) NULL,\n updated_at DATETIME(6) NOT NULL DEFAULT (UTC_TIMESTAMP(6))\n ON UPDATE CURRENT_TIMESTAMP(6),\n PRIMARY KEY (name),\n KEY ix_schedules_due (next_run_at)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n";
41
+ readonly ENQUEUE: "\nINSERT INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, ?, ?, ?, ?, COALESCE(?, UTC_TIMESTAMP(6)));\n";
42
+ readonly ENQUEUE_SINGLETON: "\nINSERT IGNORE INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, ?, ?, ?, ?, COALESCE(?, UTC_TIMESTAMP(6)));\n";
43
+ readonly LAST_INSERT_ID: "\nSELECT CAST(LAST_INSERT_ID() AS CHAR) AS id;\n";
44
+ readonly CLAIM_SELECT: "\nSELECT CAST(id AS CHAR) AS id, queue, payload, retry_count, retry_limit,\n retry_delay_secs, retry_backoff\nFROM jobs\nWHERE queue = ?\n AND state = 'available'\n AND run_at <= UTC_TIMESTAMP(6)\nORDER BY priority DESC, run_at, id\nLIMIT ?\nFOR UPDATE SKIP LOCKED;\n";
45
+ readonly CLAIM_UPDATE: "\nUPDATE jobs\nSET state = 'active',\n started_at = UTC_TIMESTAMP(6),\n locked_by = UUID_TO_BIN(?),\n lease_expires_at = UTC_TIMESTAMP(6) + INTERVAL ? SECOND\nWHERE id IN (?);\n";
46
+ readonly COMPLETE_ARCHIVE: "\nINSERT INTO jobs_archive\n (id, queue, priority, payload, singleton_key, retry_count,\n created_at, started_at, duration_ms)\nSELECT id, queue, priority, payload, singleton_key, retry_count,\n created_at, started_at,\n TIMESTAMPDIFF(MICROSECOND, started_at, UTC_TIMESTAMP(6)) DIV 1000\nFROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
47
+ readonly COMPLETE_DELETE: "\nDELETE FROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
48
+ readonly FAIL_RETRY: "\nUPDATE jobs\nSET state = 'available',\n run_at = UTC_TIMESTAMP(6) + INTERVAL\n LEAST(\n 86400,\n IF(retry_backoff = 1,\n retry_delay_secs * POW(2, retry_count),\n retry_delay_secs)\n + FLOOR(RAND() * retry_delay_secs)\n ) SECOND,\n retry_count = retry_count + 1,\n locked_by = NULL,\n lease_expires_at = NULL,\n started_at = NULL,\n last_error = ?\nWHERE id = ?\n AND locked_by = UUID_TO_BIN(?)\n AND state = 'active'\n AND retry_count < retry_limit;\n";
49
+ readonly DLQ_INSERT: "\nINSERT INTO jobs_dead\n (id, queue, priority, payload, singleton_key,\n retry_count, retry_limit, retry_delay_secs, retry_backoff,\n created_at, last_error)\nSELECT id, queue, priority, payload, singleton_key,\n retry_count + 1, retry_limit, retry_delay_secs, retry_backoff,\n created_at, ?\nFROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
50
+ readonly DLQ_DELETE: "\nDELETE FROM jobs\nWHERE id = ? AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
51
+ readonly LIST_DEAD: "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(failed_at) AS failed_at_unix,\n last_error\nFROM jobs_dead\nWHERE queue = ? AND failed_at BETWEEN ? AND ?\nORDER BY failed_at DESC\nLIMIT ? OFFSET ?;\n";
52
+ readonly REPLAY_INSERT: "\nINSERT INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nSELECT queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, UTC_TIMESTAMP(6)\nFROM jobs_dead\nWHERE id IN (?)\nFOR UPDATE;\n";
53
+ readonly REPLAY_DELETE: "\nDELETE FROM jobs_dead WHERE id IN (?);\n";
54
+ readonly DB_NOW: "SELECT UNIX_TIMESTAMP(UTC_TIMESTAMP(6)) AS db_now_unix;";
55
+ readonly TICK_SELECT: "\nSELECT name, queue, cron, timezone, payload, job_options,\n next_run_at,\n UNIX_TIMESTAMP(next_run_at) AS next_run_at_unix\nFROM schedules\nWHERE next_run_at <= UTC_TIMESTAMP(6)\nORDER BY next_run_at\nLIMIT 20\nFOR UPDATE SKIP LOCKED;\n";
56
+ readonly TICK_ENQUEUE: "\nINSERT IGNORE INTO jobs\n (queue, priority, payload, singleton_key,\n retry_limit, retry_delay_secs, retry_backoff, run_at)\nVALUES\n (?, ?, ?, CONCAT('cron:', ?, ':', DATE_FORMAT(?, '%Y%m%d%H%i%s')),\n ?, ?, ?, UTC_TIMESTAMP(6));\n";
57
+ readonly TICK_ADVANCE: "\nUPDATE schedules\nSET next_run_at = ?, last_enqueued_at = UTC_TIMESTAMP(6)\nWHERE name = ?;\n";
58
+ readonly SCHEDULE_UPSERT: "\nINSERT INTO schedules (name, queue, cron, timezone, payload, job_options, next_run_at)\nVALUES (?, ?, ?, ?, ?, ?, ?)\nON DUPLICATE KEY UPDATE\n queue = VALUES(queue),\n cron = VALUES(cron),\n timezone = VALUES(timezone),\n payload = VALUES(payload),\n job_options = VALUES(job_options),\n next_run_at = VALUES(next_run_at);\n";
59
+ readonly SCHEDULE_DELETE: "\nDELETE FROM schedules WHERE name = ?;\n";
60
+ readonly HEARTBEAT: "\nUPDATE jobs\nSET lease_expires_at = UTC_TIMESTAMP(6) + INTERVAL ? SECOND\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
61
+ readonly HEARTBEAT_OWNED: "\nSELECT CAST(id AS CHAR) AS id\nFROM jobs\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
62
+ readonly DRAIN_RELEASE: "\nUPDATE jobs\nSET state = 'available', run_at = UTC_TIMESTAMP(6),\n locked_by = NULL, lease_expires_at = NULL, started_at = NULL\nWHERE id IN (?) AND locked_by = UUID_TO_BIN(?) AND state = 'active';\n";
63
+ readonly SWEEP_SELECT: "\nSELECT CAST(id AS CHAR) AS id, retry_count, retry_limit\nFROM jobs\nWHERE state = 'active' AND lease_expires_at < UTC_TIMESTAMP(6)\nORDER BY lease_expires_at\nLIMIT 100\nFOR UPDATE SKIP LOCKED;\n";
64
+ readonly SWEEP_RETRY: "\nUPDATE jobs\nSET state = 'available',\n run_at = UTC_TIMESTAMP(6) + INTERVAL\n LEAST(\n 86400,\n IF(retry_backoff = 1,\n retry_delay_secs * POW(2, retry_count),\n retry_delay_secs)\n + FLOOR(RAND() * retry_delay_secs)\n ) SECOND,\n retry_count = retry_count + 1,\n locked_by = NULL, lease_expires_at = NULL, started_at = NULL,\n last_error = JSON_OBJECT('message', 'lease expired', 'at', UTC_TIMESTAMP(6))\nWHERE id IN (?) AND retry_count < retry_limit;\n";
65
+ readonly SWEEP_DLQ_INSERT: "\nINSERT INTO jobs_dead\n (id, queue, priority, payload, singleton_key,\n retry_count, retry_limit, retry_delay_secs, retry_backoff,\n created_at, last_error)\nSELECT id, queue, priority, payload, singleton_key,\n retry_count + 1, retry_limit, retry_delay_secs, retry_backoff,\n created_at, JSON_OBJECT('message', 'lease expired', 'at', UTC_TIMESTAMP(6))\nFROM jobs\nWHERE id IN (?);\n";
66
+ readonly SWEEP_DLQ_DELETE: "\nDELETE FROM jobs WHERE id IN (?);\n";
67
+ readonly ARCHIVE_PRUNE: "\nDELETE FROM jobs_archive\nWHERE completed_at < UTC_TIMESTAMP(6) - INTERVAL ? DAY\nORDER BY completed_at\nLIMIT 5000;\n";
68
+ readonly GET_ARCHIVED_JOB: "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, singleton_key, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(started_at) AS started_at_unix,\n UNIX_TIMESTAMP(completed_at) AS completed_at_unix,\n duration_ms\nFROM jobs_archive\nWHERE id = ?;\n";
69
+ readonly LIST_ARCHIVE: "\nSELECT CAST(id AS CHAR) AS id, queue, priority, payload, singleton_key, retry_count,\n UNIX_TIMESTAMP(created_at) AS created_at_unix,\n UNIX_TIMESTAMP(started_at) AS started_at_unix,\n UNIX_TIMESTAMP(completed_at) AS completed_at_unix,\n duration_ms\nFROM jobs_archive\nWHERE queue = ? AND completed_at < ?\nORDER BY completed_at DESC\nLIMIT ?;\n";
70
+ };
71
+ export type SqlStatements = {
72
+ [K in keyof typeof UNPREFIXED_SQL]: string;
73
+ };
74
+ /**
75
+ * Builds the SQL used by one MysqlBoss instance.
76
+ *
77
+ * Prefixes are deliberately limited to portable identifier characters. This
78
+ * lets us quote every generated table name safely instead of interpolating an
79
+ * arbitrary SQL identifier.
80
+ */
81
+ export declare function createSql(tablePrefix?: string): SqlStatements;
82
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/sql.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,mnCAuBvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,6qBAgB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,6uBAiB5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,ipBAe5B,CAAC;AAIF,eAAO,MAAM,OAAO,iMAMnB,CAAC;AAEF,eAAO,MAAM,iBAAiB,wMAM7B,CAAC;AAEF,eAAO,MAAM,cAAc,qDAE1B,CAAC;AAIF,eAAO,MAAM,YAAY,wRAUxB,CAAC;AAEF,eAAO,MAAM,YAAY,+LAOxB,CAAC;AAIF,eAAO,MAAM,gBAAgB,kYAS5B,CAAC;AAEF,eAAO,MAAM,eAAe,4FAG3B,CAAC;AAIF,eAAO,MAAM,UAAU,mhBAoBtB,CAAC;AAIF,eAAO,MAAM,UAAU,0YAUtB,CAAC;AAEF,eAAO,MAAM,UAAU,4FAGtB,CAAC;AAIF,eAAO,MAAM,SAAS,wTASrB,CAAC;AAIF,eAAO,MAAM,aAAa,sSASzB,CAAC;AAEF,eAAO,MAAM,aAAa,+CAEzB,CAAC;AAIF,eAAO,MAAM,MAAM,4DAA4D,CAAC;AAEhF,eAAO,MAAM,WAAW,+PASvB,CAAC;AAEF,eAAO,MAAM,YAAY,qPAOxB,CAAC;AAEF,eAAO,MAAM,YAAY,oGAIxB,CAAC;AAIF,eAAO,MAAM,eAAe,kVAU3B,CAAC;AAEF,eAAO,MAAM,eAAe,8CAE3B,CAAC;AAIF,eAAO,MAAM,SAAS,uJAIrB,CAAC;AAEF,eAAO,MAAM,eAAe,uHAI3B,CAAC;AAIF,eAAO,MAAM,aAAa,iNAKzB,CAAC;AAIF,eAAO,MAAM,YAAY,0MAOxB,CAAC;AAEF,eAAO,MAAM,WAAW,6gBAevB,CAAC;AAEF,eAAO,MAAM,gBAAgB,uZAU5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,0CAE5B,CAAC;AAIF,eAAO,MAAM,aAAa,6HAKzB,CAAC;AAIF,eAAO,MAAM,gBAAgB,4TAQ5B,CAAC;AAEF,eAAO,MAAM,YAAY,yXAUxB,CAAC;AAIF,eAAO,MAAM,YAAY,yGAGxB,CAAC;AAEF,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCjB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG;KAC1B,CAAC,IAAI,MAAM,OAAO,cAAc,GAAG,MAAM;CAC1C,CAAC;AASF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,WAAW,SAAuB,GAAG,aAAa,CA8B3E"}