@zukhruf/sqlite-queue 0.0.0-stage → 0.3.41
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.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/activity.d.ts +10 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +93 -0
- package/dist/activity.js.map +1 -0
- package/dist/attorney.d.ts +35 -0
- package/dist/attorney.d.ts.map +1 -0
- package/dist/attorney.js +367 -0
- package/dist/attorney.js.map +1 -0
- package/dist/claim-timer.d.ts +8 -0
- package/dist/claim-timer.d.ts.map +1 -0
- package/dist/claim-timer.js +80 -0
- package/dist/claim-timer.js.map +1 -0
- package/dist/completion-data.d.ts +6 -0
- package/dist/completion-data.d.ts.map +1 -0
- package/dist/completion-data.js +36 -0
- package/dist/completion-data.js.map +1 -0
- package/dist/database-error.d.ts +6 -0
- package/dist/database-error.d.ts.map +1 -0
- package/dist/database-error.js +12 -0
- package/dist/database-error.js.map +1 -0
- package/dist/database.d.ts +7 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +28 -0
- package/dist/database.js.map +1 -0
- package/dist/in-flight.d.ts +7 -0
- package/dist/in-flight.d.ts.map +1 -0
- package/dist/in-flight.js +24 -0
- package/dist/in-flight.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1069 -0
- package/dist/index.js.map +1 -0
- package/dist/job-fetcher.d.ts +16 -0
- package/dist/job-fetcher.d.ts.map +1 -0
- package/dist/job-fetcher.js +227 -0
- package/dist/job-fetcher.js.map +1 -0
- package/dist/job-queue.d.ts +27 -0
- package/dist/job-queue.d.ts.map +1 -0
- package/dist/job-queue.js +2 -0
- package/dist/job-queue.js.map +1 -0
- package/dist/job-rows.d.ts +49 -0
- package/dist/job-rows.d.ts.map +1 -0
- package/dist/job-rows.js +155 -0
- package/dist/job-rows.js.map +1 -0
- package/dist/job-settler.d.ts +24 -0
- package/dist/job-settler.d.ts.map +1 -0
- package/dist/job-settler.js +240 -0
- package/dist/job-settler.js.map +1 -0
- package/dist/jsonb.d.ts +7 -0
- package/dist/jsonb.d.ts.map +1 -0
- package/dist/jsonb.js +85 -0
- package/dist/jsonb.js.map +1 -0
- package/dist/local-groups.d.ts +16 -0
- package/dist/local-groups.d.ts.map +1 -0
- package/dist/local-groups.js +113 -0
- package/dist/local-groups.js.map +1 -0
- package/dist/naive-timestamp.d.ts +6 -0
- package/dist/naive-timestamp.d.ts.map +1 -0
- package/dist/naive-timestamp.js +21 -0
- package/dist/naive-timestamp.js.map +1 -0
- package/dist/queue-cache.d.ts +9 -0
- package/dist/queue-cache.d.ts.map +1 -0
- package/dist/queue-cache.js +27 -0
- package/dist/queue-cache.js.map +1 -0
- package/dist/queue-rows.d.ts +25 -0
- package/dist/queue-rows.d.ts.map +1 -0
- package/dist/queue-rows.js +44 -0
- package/dist/queue-rows.js.map +1 -0
- package/dist/recurrence.d.ts +11 -0
- package/dist/recurrence.d.ts.map +1 -0
- package/dist/recurrence.js +226 -0
- package/dist/recurrence.js.map +1 -0
- package/dist/rows.d.ts +10 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +46 -0
- package/dist/rows.js.map +1 -0
- package/dist/schema.d.ts +3 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +139 -0
- package/dist/schema.js.map +1 -0
- package/dist/sql-values.d.ts +9 -0
- package/dist/sql-values.d.ts.map +1 -0
- package/dist/sql-values.js +26 -0
- package/dist/sql-values.js.map +1 -0
- package/dist/start-after.d.ts +10 -0
- package/dist/start-after.d.ts.map +1 -0
- package/dist/start-after.js +125 -0
- package/dist/start-after.js.map +1 -0
- package/dist/supervisor.d.ts +16 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +288 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/throttle.d.ts +6 -0
- package/dist/throttle.d.ts.map +1 -0
- package/dist/throttle.js +35 -0
- package/dist/throttle.js.map +1 -0
- package/dist/timekeeper.d.ts +36 -0
- package/dist/timekeeper.d.ts.map +1 -0
- package/dist/timekeeper.js +305 -0
- package/dist/timekeeper.js.map +1 -0
- package/dist/timers.d.ts +9 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +50 -0
- package/dist/timers.js.map +1 -0
- package/dist/uuid.d.ts +7 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +36 -0
- package/dist/uuid.js.map +1 -0
- package/dist/worker.d.ts +35 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +147 -0
- package/dist/worker.js.map +1 -0
- package/package.json +53 -4
package/dist/attorney.js
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { systemClock, } from 'pg-boss';
|
|
3
|
+
// pg-boss's argument validation (node_modules/pg-boss/dist/attorney.js,
|
|
4
|
+
// 12.35.1). pg-boss ships no exports map, so these are module-private there:
|
|
5
|
+
// each assert is ported by citation and proven equal by the parity suite.
|
|
6
|
+
// pg-boss compares raw values (`config.x >= 1`); `Number(value) >= n` keeps
|
|
7
|
+
// JavaScript's relational coercion for primitives without widening types.
|
|
8
|
+
export class Attorney {
|
|
9
|
+
// attorney.js:5
|
|
10
|
+
static MAX_EXPIRATION_HOURS = 24;
|
|
11
|
+
// attorney.js:6
|
|
12
|
+
static MIN_POLLING_INTERVAL_MS = 500;
|
|
13
|
+
// attorney.js:428
|
|
14
|
+
static #clockMethods = [
|
|
15
|
+
'now',
|
|
16
|
+
'setTimeout',
|
|
17
|
+
'clearTimeout',
|
|
18
|
+
'setInterval',
|
|
19
|
+
'clearInterval',
|
|
20
|
+
];
|
|
21
|
+
// attorney.js:429-437
|
|
22
|
+
static applyClockConfig(clock) {
|
|
23
|
+
if (clock) {
|
|
24
|
+
for (const method of Attorney.#clockMethods) {
|
|
25
|
+
assert(typeof clock[method] === 'function', `configuration assert: clock must implement ${method}()`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return clock || systemClock;
|
|
29
|
+
}
|
|
30
|
+
// attorney.js:608-620, in that order: each at least a second, at most a
|
|
31
|
+
// day, 60 s when unset except maintenance's day. pg-boss writes the
|
|
32
|
+
// defaults onto its config; they are returned here.
|
|
33
|
+
static applyOpsConfig(config) {
|
|
34
|
+
const day = Attorney.MAX_EXPIRATION_HOURS * 60 * 60;
|
|
35
|
+
return {
|
|
36
|
+
superviseIntervalSeconds: Attorney.#opsInterval(config, 'superviseIntervalSeconds', 60),
|
|
37
|
+
maintenanceIntervalSeconds: Attorney.#opsInterval(config, 'maintenanceIntervalSeconds', day),
|
|
38
|
+
monitorIntervalSeconds: Attorney.#opsInterval(config, 'monitorIntervalSeconds', 60),
|
|
39
|
+
queueCacheIntervalSeconds: Attorney.#opsInterval(config, 'queueCacheIntervalSeconds', 60),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
static #opsInterval(config, key, fallback) {
|
|
43
|
+
const value = Attorney.#read(config, key);
|
|
44
|
+
assert(!(key in config) || Number(value) >= 1, `configuration assert: ${key} must be at least every second`);
|
|
45
|
+
const seconds = Number(value) || fallback;
|
|
46
|
+
assert(seconds / 60 / 60 <= Attorney.MAX_EXPIRATION_HOURS, `configuration assert: ${key} cannot exceed ${Attorney.MAX_EXPIRATION_HOURS} hours`);
|
|
47
|
+
return seconds;
|
|
48
|
+
}
|
|
49
|
+
// attorney.js:653-660, in that order. clockMonitorIntervalSeconds is
|
|
50
|
+
// validated only: it paces pg-boss's clock-skew read, and SQLite's clock is
|
|
51
|
+
// the database clock.
|
|
52
|
+
static applyScheduleConfig(config) {
|
|
53
|
+
Attorney.#scheduleInterval(config, 'clockMonitorIntervalSeconds', {
|
|
54
|
+
max: 600,
|
|
55
|
+
range: 'between 1 second and 10 minutes',
|
|
56
|
+
fallback: 600,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
cronMonitorIntervalSeconds: Attorney.#scheduleInterval(config, 'cronMonitorIntervalSeconds', { max: 45, range: 'between 1 and 45 seconds', fallback: 30 }),
|
|
60
|
+
cronWorkerIntervalSeconds: Attorney.#scheduleInterval(config, 'cronWorkerIntervalSeconds', { max: 45, range: 'between 1 and 45 seconds', fallback: 5 }),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
static #scheduleInterval(config, key, bounds) {
|
|
64
|
+
const value = Attorney.#read(config, key);
|
|
65
|
+
assert(!(key in config) || (Number(value) >= 1 && Number(value) <= bounds.max), `configuration assert: ${key} must be ${bounds.range}`);
|
|
66
|
+
return Number(value) || bounds.fallback;
|
|
67
|
+
}
|
|
68
|
+
// attorney.js:445. warningSlowQuerySeconds and warningRetentionDays (446-449)
|
|
69
|
+
// configure warnings this queue never raises or persists.
|
|
70
|
+
static validateWarningConfig(config) {
|
|
71
|
+
assert(!('warningQueueSize' in config) ||
|
|
72
|
+
Number(Attorney.#read(config, 'warningQueueSize')) >= 1, 'configuration assert: warningQueueSize must be at least 1');
|
|
73
|
+
}
|
|
74
|
+
// attorney.js:585-607: a worker's poll and notify-backstop intervals in ms.
|
|
75
|
+
// pg-boss writes them onto the options object; they are returned here.
|
|
76
|
+
static #applyPollingInterval(config) {
|
|
77
|
+
const minimum = Attorney.MIN_POLLING_INTERVAL_MS;
|
|
78
|
+
const pollingSeconds = Attorney.#read(config, 'pollingIntervalSeconds');
|
|
79
|
+
assert(!('pollingIntervalSeconds' in config) ||
|
|
80
|
+
Number(pollingSeconds) >= minimum / 1000, `configuration assert: pollingIntervalSeconds must be at least every ${minimum}ms`);
|
|
81
|
+
const pollingInterval = 'pollingIntervalSeconds' in config ? Number(pollingSeconds) * 1000 : 2000;
|
|
82
|
+
const notifySeconds = Attorney.#read(config, 'notifyPollingIntervalSeconds');
|
|
83
|
+
assert(!('notifyPollingIntervalSeconds' in config) ||
|
|
84
|
+
Number(notifySeconds) >= minimum / 1000, `configuration assert: notifyPollingIntervalSeconds must be at least every ${minimum}ms`);
|
|
85
|
+
let notifyPollingInterval = Math.max(30000, pollingInterval);
|
|
86
|
+
if ('notifyPollingIntervalSeconds' in config) {
|
|
87
|
+
notifyPollingInterval = Number(notifySeconds) * 1000;
|
|
88
|
+
assert(notifyPollingInterval >= pollingInterval, 'configuration assert: notifyPollingIntervalSeconds must be at least pollingIntervalSeconds');
|
|
89
|
+
}
|
|
90
|
+
const burstWhenReadyExceeds = Attorney.#read(config, 'burstWhenReadyExceeds');
|
|
91
|
+
assert(!('burstWhenReadyExceeds' in config) ||
|
|
92
|
+
(Number.isInteger(burstWhenReadyExceeds) &&
|
|
93
|
+
Number(burstWhenReadyExceeds) >= 1), 'configuration assert: burstWhenReadyExceeds must be an integer >= 1');
|
|
94
|
+
assert(!('burstWhenBatchFull' in config) ||
|
|
95
|
+
typeof config.burstWhenBatchFull === 'boolean', 'configuration assert: burstWhenBatchFull must be a boolean');
|
|
96
|
+
return { pollingInterval, notifyPollingInterval };
|
|
97
|
+
}
|
|
98
|
+
// attorney.js:357-383. pg-boss checks a copy of the options and writes the
|
|
99
|
+
// poll intervals onto it; they are returned here instead.
|
|
100
|
+
static checkWorkArgs(name, args) {
|
|
101
|
+
assert(name, 'queue name is required');
|
|
102
|
+
let options;
|
|
103
|
+
let callback;
|
|
104
|
+
if (args.length === 1) {
|
|
105
|
+
callback = args[0];
|
|
106
|
+
options = {};
|
|
107
|
+
}
|
|
108
|
+
else if (args.length > 1) {
|
|
109
|
+
options = args[0] || {};
|
|
110
|
+
callback = args[1];
|
|
111
|
+
}
|
|
112
|
+
assert(typeof callback === 'function', 'expected callback to be a function');
|
|
113
|
+
assert(typeof options === 'object', 'expected config to be an object');
|
|
114
|
+
const config = { ...options };
|
|
115
|
+
const intervals = Attorney.#applyPollingInterval(config);
|
|
116
|
+
const read = (key) => Attorney.#read(config, key);
|
|
117
|
+
assert(!('batchSize' in config) ||
|
|
118
|
+
(Number.isInteger(read('batchSize')) && Number(read('batchSize')) >= 1), 'batchSize must be an integer > 0');
|
|
119
|
+
assert(!('includeMetadata' in config) ||
|
|
120
|
+
typeof read('includeMetadata') === 'boolean', 'includeMetadata must be a boolean');
|
|
121
|
+
assert(!('priority' in config) || typeof read('priority') === 'boolean', 'priority must be a boolean');
|
|
122
|
+
assert(!('localConcurrency' in config) ||
|
|
123
|
+
(Number.isInteger(read('localConcurrency')) &&
|
|
124
|
+
Number(read('localConcurrency')) >= 1), 'localConcurrency must be an integer >= 1');
|
|
125
|
+
assert(!('perJobResults' in config) ||
|
|
126
|
+
typeof read('perJobResults') === 'boolean', 'perJobResults must be a boolean');
|
|
127
|
+
assert(!('transactional' in config) ||
|
|
128
|
+
typeof read('transactional') === 'boolean', 'transactional must be a boolean');
|
|
129
|
+
Attorney.#validatePriorityRangeConfig(config);
|
|
130
|
+
Attorney.#validateGroupConcurrencyConfig(config);
|
|
131
|
+
Attorney.#validateHeartbeatRefreshConfig(config);
|
|
132
|
+
Attorney.#validateTransactionalConfig(config);
|
|
133
|
+
return intervals;
|
|
134
|
+
}
|
|
135
|
+
// pg-boss reads options as plain properties, inherited ones included.
|
|
136
|
+
static #read(config, key) {
|
|
137
|
+
return key in config ? Reflect.get(config, key) : undefined;
|
|
138
|
+
}
|
|
139
|
+
// attorney.js:320-330
|
|
140
|
+
static #validatePriorityRangeConfig(config) {
|
|
141
|
+
const minPriority = Attorney.#read(config, 'minPriority');
|
|
142
|
+
const maxPriority = Attorney.#read(config, 'maxPriority');
|
|
143
|
+
if (minPriority !== undefined) {
|
|
144
|
+
assert(Number.isInteger(minPriority), 'minPriority must be an integer');
|
|
145
|
+
}
|
|
146
|
+
if (maxPriority !== undefined) {
|
|
147
|
+
assert(Number.isInteger(maxPriority), 'maxPriority must be an integer');
|
|
148
|
+
}
|
|
149
|
+
if (minPriority !== undefined && maxPriority !== undefined) {
|
|
150
|
+
assert(Number(minPriority) <= Number(maxPriority), 'minPriority must be <= maxPriority');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// attorney.js:331-341
|
|
154
|
+
static #validateGroupConcurrencyConfig(config) {
|
|
155
|
+
const groupConcurrency = Attorney.#read(config, 'groupConcurrency');
|
|
156
|
+
const localGroupConcurrency = Attorney.#read(config, 'localGroupConcurrency');
|
|
157
|
+
const hasGlobal = groupConcurrency != null;
|
|
158
|
+
const hasLocal = localGroupConcurrency != null;
|
|
159
|
+
assert(!(hasGlobal && hasLocal), 'cannot specify both groupConcurrency and localGroupConcurrency - choose one');
|
|
160
|
+
if (hasGlobal) {
|
|
161
|
+
Attorney.#validateGroupConcurrencyValue(groupConcurrency, 'groupConcurrency');
|
|
162
|
+
}
|
|
163
|
+
if (hasLocal) {
|
|
164
|
+
Attorney.#validateGroupConcurrencyValue(localGroupConcurrency, 'localGroupConcurrency');
|
|
165
|
+
Attorney.#validateLocalGroupConcurrencyLimit(localGroupConcurrency, Attorney.#read(config, 'localConcurrency'));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// attorney.js:306-319
|
|
169
|
+
static #validateGroupConcurrencyValue(value, name) {
|
|
170
|
+
if (typeof value === 'number') {
|
|
171
|
+
assert(Number.isInteger(value) && value >= 1, `${name} must be an integer >= 1`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
assert(typeof value === 'object' && value !== null, `${name} must be a number or an object with { default, tiers? }`);
|
|
175
|
+
const fallback = Attorney.#read(value, 'default');
|
|
176
|
+
assert(Number.isInteger(fallback) && Number(fallback) >= 1, `${name}.default must be an integer >= 1`);
|
|
177
|
+
const tiers = Attorney.#read(value, 'tiers');
|
|
178
|
+
if (tiers) {
|
|
179
|
+
assert(typeof tiers === 'object', `${name}.tiers must be an object`);
|
|
180
|
+
for (const [tier, limit] of Object.entries(tiers)) {
|
|
181
|
+
assert(typeof tier === 'string' && tier.length > 0, `${name} tier keys must be non-empty strings`);
|
|
182
|
+
assert(Number.isInteger(limit) && Number(limit) >= 1, `${name}.tiers["${tier}"] must be an integer >= 1`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// attorney.js:342-356
|
|
187
|
+
static #validateLocalGroupConcurrencyLimit(localGroupConcurrency, localConcurrency) {
|
|
188
|
+
const effective = localConcurrency ?? 1;
|
|
189
|
+
if (typeof localGroupConcurrency === 'number') {
|
|
190
|
+
assert(localGroupConcurrency <= Number(effective), `localGroupConcurrency (${localGroupConcurrency}) cannot exceed localConcurrency (${effective})`);
|
|
191
|
+
}
|
|
192
|
+
else if (typeof localGroupConcurrency === 'object' &&
|
|
193
|
+
localGroupConcurrency !== null) {
|
|
194
|
+
const fallback = Attorney.#read(localGroupConcurrency, 'default');
|
|
195
|
+
assert(Number(fallback) <= Number(effective), `localGroupConcurrency.default (${fallback}) cannot exceed localConcurrency (${effective})`);
|
|
196
|
+
const tiers = Attorney.#read(localGroupConcurrency, 'tiers');
|
|
197
|
+
if (typeof tiers === 'object' && tiers !== null) {
|
|
198
|
+
for (const [tier, limit] of Object.entries(tiers)) {
|
|
199
|
+
assert(Number(limit) <= Number(effective), `localGroupConcurrency.tiers["${tier}"] (${limit}) cannot exceed localConcurrency (${effective})`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// attorney.js:401-405
|
|
205
|
+
static #validateHeartbeatRefreshConfig(config) {
|
|
206
|
+
const refresh = Attorney.#read(config, 'heartbeatRefreshSeconds');
|
|
207
|
+
if (refresh == null) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
assert(typeof refresh === 'number' && refresh > 0, 'heartbeatRefreshSeconds must be a number > 0');
|
|
211
|
+
}
|
|
212
|
+
// attorney.js:388-398
|
|
213
|
+
static #validateTransactionalConfig(config) {
|
|
214
|
+
const timeout = Attorney.#read(config, 'transactionTimeoutSeconds');
|
|
215
|
+
assert(!('transactionTimeoutSeconds' in config) ||
|
|
216
|
+
(Number.isInteger(timeout) && Number(timeout) >= 0), 'transactionTimeoutSeconds must be an integer >= 0');
|
|
217
|
+
if (!Attorney.#read(config, 'transactional')) {
|
|
218
|
+
assert(!('transactionTimeoutSeconds' in config), 'transactionTimeoutSeconds requires transactional');
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
assert(!Attorney.#read(config, 'perJobResults'), 'transactional cannot be combined with perJobResults');
|
|
222
|
+
}
|
|
223
|
+
// attorney.js:87-89
|
|
224
|
+
static assertObjectName(value, name) {
|
|
225
|
+
assert(/^[\w.\-/]+$/.test(String(value)), `${name} can only contain alphanumeric characters, underscores, hyphens, periods, or forward slashes`);
|
|
226
|
+
}
|
|
227
|
+
// manager.js:1596-1605: ids, or jobs as fetch() and work() hand them out,
|
|
228
|
+
// whose retryCount fences the call to the attempt that was fetched.
|
|
229
|
+
static mapAttemptArg(id, funcName) {
|
|
230
|
+
assert(id, `${funcName}() requires an id`);
|
|
231
|
+
const items = Array.isArray(id) ? id : [id];
|
|
232
|
+
assert(items.length, `${funcName}() requires an id`);
|
|
233
|
+
if (items.every((item) => typeof item === 'string')) {
|
|
234
|
+
return { ids: items };
|
|
235
|
+
}
|
|
236
|
+
const jobs = items.filter((item) => typeof item === 'object' &&
|
|
237
|
+
item !== null &&
|
|
238
|
+
typeof item.id === 'string' &&
|
|
239
|
+
Number.isInteger(item.retryCount) &&
|
|
240
|
+
item.retryCount >= 0);
|
|
241
|
+
assert(jobs.length === items.length, `${funcName}() requires either ids or jobs with an id and an integer retryCount, not a mix`);
|
|
242
|
+
return {
|
|
243
|
+
ids: jobs.map((job) => job.id),
|
|
244
|
+
attempts: jobs.map((job) => job.retryCount),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// attorney.js:554-559
|
|
248
|
+
static assertKey(key) {
|
|
249
|
+
if (!key) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
assert(typeof key === 'string', 'Key must be a string');
|
|
253
|
+
Attorney.assertObjectName(key, 'Key');
|
|
254
|
+
}
|
|
255
|
+
// attorney.js:549-553
|
|
256
|
+
static assertQueueName(name) {
|
|
257
|
+
assert(name, 'Name is required');
|
|
258
|
+
assert(typeof name === 'string', 'Name must be a string');
|
|
259
|
+
Attorney.assertObjectName(name, 'Name');
|
|
260
|
+
}
|
|
261
|
+
// attorney.js:90-101
|
|
262
|
+
static validateQueueArgs(config) {
|
|
263
|
+
const deadLetter = 'deadLetter' in config ? config.deadLetter : undefined;
|
|
264
|
+
assert(!('deadLetter' in config) ||
|
|
265
|
+
deadLetter === null ||
|
|
266
|
+
typeof deadLetter === 'string', 'deadLetter must be a string');
|
|
267
|
+
assert(!('notify' in config) || typeof config.notify === 'boolean', 'notify must be a boolean');
|
|
268
|
+
if (deadLetter) {
|
|
269
|
+
Attorney.assertObjectName(deadLetter, 'deadLetter');
|
|
270
|
+
}
|
|
271
|
+
Attorney.#validateRetryConfig(config);
|
|
272
|
+
Attorney.#validateExpirationConfig(config);
|
|
273
|
+
Attorney.#validateRetentionConfig(config);
|
|
274
|
+
Attorney.#validateDeletionConfig(config);
|
|
275
|
+
Attorney.#validateHeartbeatConfig(config);
|
|
276
|
+
}
|
|
277
|
+
// attorney.js:118-153: the positional send(name, data, options) and the
|
|
278
|
+
// request send({ name, data, options }), the options checked and returned
|
|
279
|
+
// as an own-property copy. The startAfter normalization it ends with lives
|
|
280
|
+
// in StartAfter.
|
|
281
|
+
static checkSendArgs(args) {
|
|
282
|
+
let name;
|
|
283
|
+
let data;
|
|
284
|
+
let options;
|
|
285
|
+
const [first] = args;
|
|
286
|
+
if (typeof first === 'string') {
|
|
287
|
+
name = first;
|
|
288
|
+
data = args[1];
|
|
289
|
+
assert(typeof data !== 'function', 'send() cannot accept a function as the payload. Did you intend to use work()?');
|
|
290
|
+
options = args[2];
|
|
291
|
+
}
|
|
292
|
+
else if (typeof first === 'object') {
|
|
293
|
+
assert(args.length === 1, 'send object API only accepts 1 argument');
|
|
294
|
+
assert(first, 'boss requires all jobs to have a name');
|
|
295
|
+
name = Attorney.#read(first, 'name');
|
|
296
|
+
data = Attorney.#read(first, 'data');
|
|
297
|
+
options = Attorney.#read(first, 'options');
|
|
298
|
+
}
|
|
299
|
+
const supplied = options || {};
|
|
300
|
+
assert(name, 'boss requires all jobs to have a queue name');
|
|
301
|
+
assert(typeof supplied === 'object', 'options should be an object');
|
|
302
|
+
const copy = { ...supplied };
|
|
303
|
+
assert(!('priority' in copy) || Number.isInteger(copy.priority), 'priority must be an integer');
|
|
304
|
+
Attorney.#validateRetryConfig(copy);
|
|
305
|
+
Attorney.#validateExpirationConfig(copy);
|
|
306
|
+
Attorney.#validateRetentionConfig(copy);
|
|
307
|
+
Attorney.#validateDeletionConfig(copy);
|
|
308
|
+
Attorney.#validateGroupConfig(copy);
|
|
309
|
+
Attorney.#validateHeartbeatConfig(copy);
|
|
310
|
+
return { name, data, options: copy };
|
|
311
|
+
}
|
|
312
|
+
// attorney.js:208-215
|
|
313
|
+
static #validateGroupConfig(config) {
|
|
314
|
+
if (!('group' in config) ||
|
|
315
|
+
config.group === undefined ||
|
|
316
|
+
config.group === null) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const group = config.group;
|
|
320
|
+
assert(typeof group === 'object', 'group must be an object');
|
|
321
|
+
assert('id' in group && typeof group.id === 'string' && group.id.length > 0, 'group.id must be a non-empty string');
|
|
322
|
+
assert(!('tier' in group) ||
|
|
323
|
+
(typeof group.tier === 'string' && group.tier.length > 0), 'group.tier must be a non-empty string if provided');
|
|
324
|
+
}
|
|
325
|
+
// attorney.js:570-576
|
|
326
|
+
static #validateRetryConfig(config) {
|
|
327
|
+
assert(!('retryDelay' in config) ||
|
|
328
|
+
(Number.isInteger(config.retryDelay) && Number(config.retryDelay) >= 0), 'retryDelay must be an integer >= 0');
|
|
329
|
+
assert(!('retryLimit' in config) ||
|
|
330
|
+
(Number.isInteger(config.retryLimit) && Number(config.retryLimit) >= 0), 'retryLimit must be an integer >= 0');
|
|
331
|
+
assert(!('retryBackoff' in config) ||
|
|
332
|
+
config.retryBackoff === true ||
|
|
333
|
+
config.retryBackoff === false, 'retryBackoff must be either true or false');
|
|
334
|
+
const retryBackoff = 'retryBackoff' in config ? config.retryBackoff : undefined;
|
|
335
|
+
assert(!('retryDelayMax' in config) ||
|
|
336
|
+
config.retryDelayMax === null ||
|
|
337
|
+
retryBackoff === true, 'retryDelayMax can only be set if retryBackoff is true');
|
|
338
|
+
assert(!('retryDelayMax' in config) ||
|
|
339
|
+
config.retryDelayMax === null ||
|
|
340
|
+
(Number.isInteger(config.retryDelayMax) &&
|
|
341
|
+
Number(config.retryDelayMax) >= 0), 'retryDelayMax must be an integer >= 0');
|
|
342
|
+
}
|
|
343
|
+
// attorney.js:563-569
|
|
344
|
+
static #validateExpirationConfig(config) {
|
|
345
|
+
const expireInSeconds = 'expireInSeconds' in config ? config.expireInSeconds : undefined;
|
|
346
|
+
assert(!('expireInSeconds' in config) || Number(expireInSeconds) >= 1, 'configuration assert: expireInSeconds must be at least every second');
|
|
347
|
+
assert(!expireInSeconds ||
|
|
348
|
+
Number(expireInSeconds) / 60 / 60 <= Attorney.MAX_EXPIRATION_HOURS, `configuration assert: expiration cannot exceed ${Attorney.MAX_EXPIRATION_HOURS} hours`);
|
|
349
|
+
}
|
|
350
|
+
// attorney.js:560-562
|
|
351
|
+
static #validateRetentionConfig(config) {
|
|
352
|
+
assert(!('retentionSeconds' in config) || Number(config.retentionSeconds) >= 1, 'configuration assert: retentionSeconds must be at least every second');
|
|
353
|
+
}
|
|
354
|
+
// attorney.js:650-652
|
|
355
|
+
static #validateDeletionConfig(config) {
|
|
356
|
+
assert(!('deleteAfterSeconds' in config) ||
|
|
357
|
+
Number(config.deleteAfterSeconds) >= 0, 'configuration assert: deleteAfterSeconds must be at least 0 (0 disables deletion)');
|
|
358
|
+
}
|
|
359
|
+
// attorney.js:577-579
|
|
360
|
+
static #validateHeartbeatConfig(config) {
|
|
361
|
+
assert(!('heartbeatSeconds' in config) ||
|
|
362
|
+
config.heartbeatSeconds === null ||
|
|
363
|
+
(Number.isInteger(config.heartbeatSeconds) &&
|
|
364
|
+
Number(config.heartbeatSeconds) >= 10), 'heartbeatSeconds must be an integer >= 10');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=attorney.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attorney.js","sourceRoot":"","sources":["../src/attorney.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-timer.d.ts","sourceRoot":"","sources":["../src/claim-timer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,SAAS,CAAC;AAOjD,qBAAa,UAAU;;gBAaT,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAOlE,IAAI,IAAI,IAAI;IAOZ,MAAM,CAAC,EAAE,SAAW,GAAG,IAAI;CAmD5B"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// pg-boss's ClaimTimer (node_modules/pg-boss/dist/claimTimer.js): a pass
|
|
2
|
+
// re-arms the next attempt through anchor() once its claims are stamped, and
|
|
3
|
+
// one that never reached them is re-armed from its own end, so the chain
|
|
4
|
+
// survives a pass that skipped or threw. It arms at construction and runs
|
|
5
|
+
// until stop(), once.
|
|
6
|
+
export class ClaimTimer {
|
|
7
|
+
#clock;
|
|
8
|
+
#ms;
|
|
9
|
+
#fn;
|
|
10
|
+
#stopped = new AbortController();
|
|
11
|
+
#handle;
|
|
12
|
+
#due = 0;
|
|
13
|
+
// pg-boss's #anchored is cleared as each pass starts and set by anchor():
|
|
14
|
+
// a pass was anchored when the last anchor() came after the last pass
|
|
15
|
+
// started.
|
|
16
|
+
#passes = 0;
|
|
17
|
+
#anchoredPass = 0;
|
|
18
|
+
constructor(clock, seconds, fn) {
|
|
19
|
+
this.#clock = clock;
|
|
20
|
+
this.#ms = seconds * 1000;
|
|
21
|
+
this.#fn = fn;
|
|
22
|
+
this.#arm();
|
|
23
|
+
}
|
|
24
|
+
stop() {
|
|
25
|
+
this.#stopped.abort();
|
|
26
|
+
this.#disarm();
|
|
27
|
+
}
|
|
28
|
+
// claimTimer.js:66-71: the next attempt an interval from now, or after
|
|
29
|
+
// `ms` when the pass knows when the claim it lost to comes due.
|
|
30
|
+
anchor(ms = this.#ms) {
|
|
31
|
+
if (this.#stopped.signal.aborted) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.#anchoredPass = this.#passes;
|
|
35
|
+
this.#arm(ms);
|
|
36
|
+
}
|
|
37
|
+
#arm(ms = this.#ms) {
|
|
38
|
+
this.#disarm();
|
|
39
|
+
if (this.#stopped.signal.aborted) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.#due = this.#clock.now() + ms;
|
|
43
|
+
this.#wait(ms);
|
|
44
|
+
}
|
|
45
|
+
// claimTimer.js:79-94: a timer that fires short of its due time waits out
|
|
46
|
+
// the rest.
|
|
47
|
+
#wait(ms) {
|
|
48
|
+
this.#handle = this.#clock.setTimeout(() => {
|
|
49
|
+
const remaining = this.#due - this.#clock.now();
|
|
50
|
+
if (remaining > 0) {
|
|
51
|
+
this.#wait(remaining);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
void this.#run();
|
|
55
|
+
}
|
|
56
|
+
}, ms);
|
|
57
|
+
}
|
|
58
|
+
#disarm() {
|
|
59
|
+
if (this.#handle !== undefined) {
|
|
60
|
+
this.#clock.clearTimeout(this.#handle);
|
|
61
|
+
this.#handle = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// claimTimer.js:101-119: a rejection is left to the process, as pg-boss
|
|
65
|
+
// leaves it: every pass reports its own failure, so only an error event
|
|
66
|
+
// nobody listens for gets here.
|
|
67
|
+
async #run() {
|
|
68
|
+
this.#handle = undefined;
|
|
69
|
+
this.#passes += 1;
|
|
70
|
+
try {
|
|
71
|
+
await this.#fn();
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
if (this.#anchoredPass !== this.#passes) {
|
|
75
|
+
this.#arm();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=claim-timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-timer.js","sourceRoot":"","sources":["../src/claim-timer.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,6EAA6E;AAC7E,yEAAyE;AACzE,0EAA0E;AAC1E,sBAAsB;AACtB,MAAM,OAAO,UAAU;IACZ,MAAM,CAAQ;IACd,GAAG,CAAS;IACZ,GAAG,CAAsB;IACzB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,OAAO,CAAyB;IAChC,IAAI,GAAG,CAAC,CAAC;IACT,0EAA0E;IAC1E,sEAAsE;IACtE,WAAW;IACX,OAAO,GAAG,CAAC,CAAC;IACZ,aAAa,GAAG,CAAC,CAAC;IAElB,YAAY,KAAY,EAAE,OAAe,EAAE,EAAuB;QAChE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG;QAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG;QAChB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,0EAA0E;IAC1E,YAAY;IACZ,KAAK,CAAC,EAAU;QACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,wEAAwE;IACxE,gCAAgC;IAChC,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-data.d.ts","sourceRoot":"","sources":["../src/completion-data.ts"],"names":[],"mappings":"AAIA,qBAAa,cAAc;;IAGzB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAY9C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE;CAsBxD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { serializeError } from 'serialize-error';
|
|
2
|
+
import { Jsonb } from "./jsonb.js";
|
|
3
|
+
export class CompletionData {
|
|
4
|
+
// What complete() and fail() bind as their jsonb parameter. The drivers send
|
|
5
|
+
// null and undefined as SQL NULL.
|
|
6
|
+
static serialize(data) {
|
|
7
|
+
const output = CompletionData.#map(data);
|
|
8
|
+
return output === null || output === undefined
|
|
9
|
+
? null
|
|
10
|
+
: Jsonb.parameter(output);
|
|
11
|
+
}
|
|
12
|
+
// A group's outputs bound as one JSON recordset (node_modules/pg-boss/dist/
|
|
13
|
+
// manager.js:412, 422, 447, 451; plans.js:2137, 2654, 2667): every output is
|
|
14
|
+
// mapped before the payload is stringified, and each row's output is then
|
|
15
|
+
// stored as the JSON value it is, so a mapped string stays a JSON string.
|
|
16
|
+
// An output the payload leaves out or holds as JSON null is SQL NULL.
|
|
17
|
+
static serializeAll(data) {
|
|
18
|
+
const outputs = data.map((item) => CompletionData.#map(item));
|
|
19
|
+
const texts = outputs.map((output) => JSON.stringify(output));
|
|
20
|
+
return texts.map((text) => text === undefined || text === 'null' ? null : Jsonb.parameter(text));
|
|
21
|
+
}
|
|
22
|
+
// pg-boss's mapCompletionDataArg (node_modules/pg-boss/dist/manager.js:
|
|
23
|
+
// 1614-1622): what complete() and fail() store as a job's output. Nothing,
|
|
24
|
+
// undefined and functions store null; an object that is not an array stores
|
|
25
|
+
// as it is; anything else, arrays included, as { value }. serialize-error
|
|
26
|
+
// turns an Error into { name, message, stack, ... } and an object with toJSON
|
|
27
|
+
// into what toJSON returns.
|
|
28
|
+
static #map(data) {
|
|
29
|
+
if (data === null || data === undefined || typeof data === 'function') {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const result = typeof data === 'object' && !Array.isArray(data) ? data : { value: data };
|
|
33
|
+
return serializeError(result);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=completion-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-data.js","sourceRoot":"","sources":["../src/completion-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,cAAc;IACzB,6EAA6E;IAC7E,kCAAkC;IAClC,MAAM,CAAC,SAAS,CAAC,IAAa;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;YAC5C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,CAAC,YAAY,CAAC,IAAe;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CACrE,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,8EAA8E;IAC9E,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CAAC,IAAa;QACvB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GACV,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5E,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-error.d.ts","sourceRoot":"","sources":["../src/database-error.ts"],"names":[],"mappings":"AAGA,qBAAa,aAAc,SAAQ,KAAK;IAC7B,IAAI,SAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// pg-boss surfaces some driver errors as they are, and node-postgres and
|
|
2
|
+
// PGlite both name those `error` and carry Postgres's SQLSTATE as `code`
|
|
3
|
+
// (node_modules/pg-protocol/dist/messages.js:36-41).
|
|
4
|
+
export class DatabaseError extends Error {
|
|
5
|
+
name = 'error';
|
|
6
|
+
code;
|
|
7
|
+
constructor(message, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=database-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-error.js","sourceRoot":"","sources":["../src/database-error.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,qDAAqD;AACrD,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,GAAG,OAAO,CAAC;IACf,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAMA,qBAAa,QAAQ;;IAEnB,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAKjD,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAMrD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;CAezD"}
|
package/dist/database.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Extended result codes (https://www.sqlite.org/rescode.html#constraint_unique,
|
|
2
|
+
// #constraint_foreignkey); Postgres's are SQLSTATE 23505 and 23503.
|
|
3
|
+
const SQLITE_CONSTRAINT_UNIQUE = 2067;
|
|
4
|
+
const SQLITE_CONSTRAINT_FOREIGNKEY = 787;
|
|
5
|
+
const SQLITE_CONSTRAINT_NOTNULL = 1299;
|
|
6
|
+
export class Database {
|
|
7
|
+
// node:sqlite carries SQLite's extended result code as `errcode`.
|
|
8
|
+
static isUniqueViolation(error) {
|
|
9
|
+
return Database.#hasErrcode(error, SQLITE_CONSTRAINT_UNIQUE);
|
|
10
|
+
}
|
|
11
|
+
// SQLite names no constraint, so callers name pg-boss's.
|
|
12
|
+
static isForeignKeyViolation(error) {
|
|
13
|
+
return Database.#hasErrcode(error, SQLITE_CONSTRAINT_FOREIGNKEY);
|
|
14
|
+
}
|
|
15
|
+
// The column a NOT NULL violation names (`NOT NULL constraint failed:
|
|
16
|
+
// table.column`), or undefined for any other error.
|
|
17
|
+
static notNullColumn(error) {
|
|
18
|
+
if (!(error instanceof Error) ||
|
|
19
|
+
!Database.#hasErrcode(error, SQLITE_CONSTRAINT_NOTNULL)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return error.message.slice(error.message.lastIndexOf('.') + 1);
|
|
23
|
+
}
|
|
24
|
+
static #hasErrcode(error, errcode) {
|
|
25
|
+
return (error instanceof Error && 'errcode' in error && error.errcode === errcode);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oEAAoE;AACpE,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AACzC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAEvC,MAAM,OAAO,QAAQ;IACnB,kEAAkE;IAClE,MAAM,CAAC,iBAAiB,CAAC,KAAc;QACrC,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IAED,yDAAyD;IACzD,MAAM,CAAC,qBAAqB,CAAC,KAAc;QACzC,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;IACnE,CAAC;IAED,sEAAsE;IACtE,oDAAoD;IACpD,MAAM,CAAC,aAAa,CAAC,KAAc;QACjC,IACE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YACzB,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,yBAAyB,CAAC,EACvD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,KAAc,EAAE,OAAe;QAChD,OAAO,CACL,KAAK,YAAY,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAC1E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-flight.d.ts","sourceRoot":"","sources":["../src/in-flight.ts"],"names":[],"mappings":"AAQA,qBAAa,QAAQ,CAAC,CAAC;;gBAGT,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC;IASpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|