pg-boss 10.4.0 → 10.4.1
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/.claude/settings.local.json +11 -1
- package/dist/attorney.d.ts +19 -0
- package/dist/attorney.d.ts.map +1 -0
- package/dist/attorney.js +227 -0
- package/dist/bam.d.ts +14 -0
- package/dist/bam.d.ts.map +1 -0
- package/dist/bam.js +114 -0
- package/dist/boss.d.ts +16 -0
- package/dist/boss.d.ts.map +1 -0
- package/dist/boss.js +163 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +333 -0
- package/dist/contractor.d.ts +22 -0
- package/dist/contractor.d.ts.map +1 -0
- package/dist/contractor.js +81 -0
- package/dist/db.d.ts +16 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +46 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +266 -0
- package/dist/manager.d.ts +93 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +746 -0
- package/dist/migrationStore.d.ts +7 -0
- package/dist/migrationStore.d.ts.map +1 -0
- package/dist/migrationStore.js +425 -0
- package/dist/plans.d.ts +102 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +1220 -0
- package/dist/spy.d.ts +23 -0
- package/dist/spy.d.ts.map +1 -0
- package/dist/spy.js +73 -0
- package/dist/timekeeper.d.ts +34 -0
- package/dist/timekeeper.d.ts.map +1 -0
- package/dist/timekeeper.js +158 -0
- package/dist/tools.d.ts +18 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +45 -0
- package/dist/types.d.ts +301 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/worker.d.ts +43 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +113 -0
- package/package.json +1 -1
- package/src/plans.js +4 -4
package/dist/cli.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from 'node:util';
|
|
3
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import Db from "./db.js";
|
|
6
|
+
import * as plans from "./plans.js";
|
|
7
|
+
import * as migrationStore from "./migrationStore.js";
|
|
8
|
+
import packageJson from '../package.json' with { type: 'json' };
|
|
9
|
+
const schemaVersion = packageJson.pgboss.schema;
|
|
10
|
+
function printHelp() {
|
|
11
|
+
console.log(`
|
|
12
|
+
pg-boss CLI v${packageJson.version}
|
|
13
|
+
|
|
14
|
+
Usage: pg-boss <command> [options]
|
|
15
|
+
|
|
16
|
+
Commands:
|
|
17
|
+
migrate Run pending migrations (creates schema if not exists)
|
|
18
|
+
create Create the pg-boss schema (initial installation)
|
|
19
|
+
version Show current schema version
|
|
20
|
+
plans Output SQL plans without executing
|
|
21
|
+
rollback Rollback the last migration
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--help, -h Show this help message
|
|
25
|
+
--config, -c <file> Path to config file (default: pgboss.json)
|
|
26
|
+
--schema, -s <name> Schema name (default: pgboss)
|
|
27
|
+
--host <host> Database host
|
|
28
|
+
--port <port> Database port
|
|
29
|
+
--database, -d <name> Database name
|
|
30
|
+
--user, -u <user> Database user
|
|
31
|
+
--password, -p <pass> Database password
|
|
32
|
+
--connection-string Full connection string (overrides other connection options)
|
|
33
|
+
--ssl Enable SSL connection
|
|
34
|
+
--dry-run Output SQL without executing (for plans command)
|
|
35
|
+
|
|
36
|
+
Environment Variables:
|
|
37
|
+
PGBOSS_DATABASE_URL Full connection string
|
|
38
|
+
PGBOSS_HOST Database host
|
|
39
|
+
PGBOSS_PORT Database port
|
|
40
|
+
PGBOSS_DATABASE Database name
|
|
41
|
+
PGBOSS_USER Database user
|
|
42
|
+
PGBOSS_PASSWORD Database password
|
|
43
|
+
PGBOSS_SCHEMA Schema name (default: pgboss)
|
|
44
|
+
|
|
45
|
+
Config File (pgboss.json):
|
|
46
|
+
{
|
|
47
|
+
"host": "localhost",
|
|
48
|
+
"port": 5432,
|
|
49
|
+
"database": "mydb",
|
|
50
|
+
"user": "postgres",
|
|
51
|
+
"password": "secret",
|
|
52
|
+
"schema": "pgboss",
|
|
53
|
+
"ssl": false
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
Examples:
|
|
57
|
+
pg-boss migrate
|
|
58
|
+
pg-boss migrate --schema my_schema
|
|
59
|
+
pg-boss create --connection-string postgres://user:pass@localhost/db
|
|
60
|
+
pg-boss plans migrate --dry-run
|
|
61
|
+
pg-boss version
|
|
62
|
+
PGBOSS_DATABASE_URL=postgres://localhost/mydb pg-boss migrate
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
function loadConfigFile(configPath) {
|
|
66
|
+
const paths = configPath
|
|
67
|
+
? [resolve(configPath)]
|
|
68
|
+
: [
|
|
69
|
+
resolve('pgboss.json'),
|
|
70
|
+
resolve('.pgbossrc'),
|
|
71
|
+
resolve('.pgbossrc.json')
|
|
72
|
+
];
|
|
73
|
+
for (const filePath of paths) {
|
|
74
|
+
if (existsSync(filePath)) {
|
|
75
|
+
try {
|
|
76
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
77
|
+
const config = JSON.parse(content);
|
|
78
|
+
console.log(`Loaded config from ${filePath}`);
|
|
79
|
+
return config;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(`Error reading config file ${filePath}: ${err.message}`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
function getConnectionConfig(args) {
|
|
90
|
+
const fileConfig = loadConfigFile(args.config);
|
|
91
|
+
const config = {
|
|
92
|
+
connectionString: args.connectionString || process.env.PGBOSS_DATABASE_URL || fileConfig.connectionString,
|
|
93
|
+
host: args.host || process.env.PGBOSS_HOST || fileConfig.host,
|
|
94
|
+
port: args.port ? parseInt(args.port, 10) : (process.env.PGBOSS_PORT ? parseInt(process.env.PGBOSS_PORT, 10) : fileConfig.port),
|
|
95
|
+
database: args.database || process.env.PGBOSS_DATABASE || fileConfig.database,
|
|
96
|
+
user: args.user || process.env.PGBOSS_USER || fileConfig.user,
|
|
97
|
+
password: args.password || process.env.PGBOSS_PASSWORD || fileConfig.password,
|
|
98
|
+
schema: args.schema || process.env.PGBOSS_SCHEMA || fileConfig.schema || plans.DEFAULT_SCHEMA
|
|
99
|
+
};
|
|
100
|
+
if (args.ssl || fileConfig.ssl) {
|
|
101
|
+
config.ssl = args.ssl ? { rejectUnauthorized: false } : fileConfig.ssl;
|
|
102
|
+
}
|
|
103
|
+
if (!config.connectionString && !config.host && !config.database) {
|
|
104
|
+
console.error('Error: No database connection configured.');
|
|
105
|
+
console.error('Provide connection via --connection-string, environment variables, or config file.');
|
|
106
|
+
console.error('Run "pg-boss --help" for more information.');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
return config;
|
|
110
|
+
}
|
|
111
|
+
function parseCliArgs() {
|
|
112
|
+
const { values, positionals } = parseArgs({
|
|
113
|
+
options: {
|
|
114
|
+
help: { type: 'boolean', short: 'h' },
|
|
115
|
+
config: { type: 'string', short: 'c' },
|
|
116
|
+
schema: { type: 'string', short: 's' },
|
|
117
|
+
host: { type: 'string' },
|
|
118
|
+
port: { type: 'string' },
|
|
119
|
+
database: { type: 'string', short: 'd' },
|
|
120
|
+
user: { type: 'string', short: 'u' },
|
|
121
|
+
password: { type: 'string', short: 'p' },
|
|
122
|
+
'connection-string': { type: 'string' },
|
|
123
|
+
ssl: { type: 'boolean' },
|
|
124
|
+
'dry-run': { type: 'boolean' }
|
|
125
|
+
},
|
|
126
|
+
allowPositionals: true
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
help: values.help,
|
|
130
|
+
config: values.config,
|
|
131
|
+
schema: values.schema,
|
|
132
|
+
host: values.host,
|
|
133
|
+
port: values.port,
|
|
134
|
+
database: values.database,
|
|
135
|
+
user: values.user,
|
|
136
|
+
password: values.password,
|
|
137
|
+
connectionString: values['connection-string'],
|
|
138
|
+
ssl: values.ssl,
|
|
139
|
+
dryRun: values['dry-run'],
|
|
140
|
+
command: positionals[0],
|
|
141
|
+
subCommand: positionals[1]
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async function createDb(config) {
|
|
145
|
+
const db = new Db(config);
|
|
146
|
+
await db.open();
|
|
147
|
+
return db;
|
|
148
|
+
}
|
|
149
|
+
async function getSchemaVersion(db, schema) {
|
|
150
|
+
try {
|
|
151
|
+
const result = await db.executeSql(plans.versionTableExists(schema));
|
|
152
|
+
if (!result.rows[0].name) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const versionResult = await db.executeSql(plans.getVersion(schema));
|
|
156
|
+
return versionResult.rows.length ? parseInt(versionResult.rows[0].version) : null;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function cmdVersion(args) {
|
|
163
|
+
const config = getConnectionConfig(args);
|
|
164
|
+
const schema = config.schema || plans.DEFAULT_SCHEMA;
|
|
165
|
+
const db = await createDb(config);
|
|
166
|
+
try {
|
|
167
|
+
const version = await getSchemaVersion(db, schema);
|
|
168
|
+
if (version === null) {
|
|
169
|
+
console.log(`pg-boss is not installed in schema "${schema}"`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.log(`Current schema version: ${version}`);
|
|
173
|
+
console.log(`Latest schema version: ${schemaVersion}`);
|
|
174
|
+
if (version < schemaVersion) {
|
|
175
|
+
console.log(`Migrations pending: ${schemaVersion - version}`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.log('Schema is up to date');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await db.close();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async function cmdCreate(args) {
|
|
187
|
+
const config = getConnectionConfig(args);
|
|
188
|
+
const schema = config.schema || plans.DEFAULT_SCHEMA;
|
|
189
|
+
if (args.dryRun) {
|
|
190
|
+
const sql = plans.create(schema, schemaVersion, { createSchema: true });
|
|
191
|
+
console.log('-- SQL to create pg-boss schema:');
|
|
192
|
+
console.log(sql);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const db = await createDb(config);
|
|
196
|
+
try {
|
|
197
|
+
const version = await getSchemaVersion(db, schema);
|
|
198
|
+
if (version !== null) {
|
|
199
|
+
console.log(`pg-boss is already installed in schema "${schema}" at version ${version}`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
console.log(`Creating pg-boss schema "${schema}"...`);
|
|
203
|
+
const sql = plans.create(schema, schemaVersion, { createSchema: true });
|
|
204
|
+
await db.executeSql(sql);
|
|
205
|
+
console.log(`Successfully created pg-boss schema "${schema}" at version ${schemaVersion}`);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
await db.close();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async function cmdMigrate(args) {
|
|
212
|
+
const config = getConnectionConfig(args);
|
|
213
|
+
const schema = config.schema || plans.DEFAULT_SCHEMA;
|
|
214
|
+
if (args.dryRun) {
|
|
215
|
+
const sql = migrationStore.migrate(schema, 0);
|
|
216
|
+
console.log('-- SQL to migrate pg-boss from version 0 to latest:');
|
|
217
|
+
console.log(sql);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const db = await createDb(config);
|
|
221
|
+
try {
|
|
222
|
+
const version = await getSchemaVersion(db, schema);
|
|
223
|
+
if (version === null) {
|
|
224
|
+
console.log(`pg-boss is not installed. Creating schema "${schema}"...`);
|
|
225
|
+
const sql = plans.create(schema, schemaVersion, { createSchema: true });
|
|
226
|
+
await db.executeSql(sql);
|
|
227
|
+
console.log(`Successfully created pg-boss schema "${schema}" at version ${schemaVersion}`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (version >= schemaVersion) {
|
|
231
|
+
console.log(`pg-boss schema "${schema}" is already at version ${version} (latest: ${schemaVersion})`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
console.log(`Migrating pg-boss schema "${schema}" from version ${version} to ${schemaVersion}...`);
|
|
235
|
+
const sql = migrationStore.migrate(schema, version);
|
|
236
|
+
await db.executeSql(sql);
|
|
237
|
+
console.log(`Successfully migrated pg-boss schema "${schema}" to version ${schemaVersion}`);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
await db.close();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function cmdRollback(args) {
|
|
244
|
+
const config = getConnectionConfig(args);
|
|
245
|
+
const schema = config.schema || plans.DEFAULT_SCHEMA;
|
|
246
|
+
const db = await createDb(config);
|
|
247
|
+
try {
|
|
248
|
+
const version = await getSchemaVersion(db, schema);
|
|
249
|
+
if (version === null) {
|
|
250
|
+
console.log(`pg-boss is not installed in schema "${schema}"`);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (version <= 1) {
|
|
254
|
+
console.log('Cannot rollback: already at minimum version');
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (args.dryRun) {
|
|
258
|
+
const sql = migrationStore.rollback(schema, version);
|
|
259
|
+
console.log(`-- SQL to rollback pg-boss from version ${version} to ${version - 1}:`);
|
|
260
|
+
console.log(sql);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
console.log(`Rolling back pg-boss schema "${schema}" from version ${version} to ${version - 1}...`);
|
|
264
|
+
const sql = migrationStore.rollback(schema, version);
|
|
265
|
+
await db.executeSql(sql);
|
|
266
|
+
console.log(`Successfully rolled back pg-boss schema "${schema}" to version ${version - 1}`);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
await db.close();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async function cmdPlans(args) {
|
|
273
|
+
const fileConfig = loadConfigFile(args.config);
|
|
274
|
+
const schema = args.schema || process.env.PGBOSS_SCHEMA || fileConfig.schema || plans.DEFAULT_SCHEMA;
|
|
275
|
+
const subCommand = args.subCommand || 'migrate';
|
|
276
|
+
switch (subCommand) {
|
|
277
|
+
case 'create':
|
|
278
|
+
case 'construct':
|
|
279
|
+
console.log('-- SQL to create pg-boss schema:');
|
|
280
|
+
console.log(plans.create(schema, schemaVersion, { createSchema: true }));
|
|
281
|
+
break;
|
|
282
|
+
case 'migrate':
|
|
283
|
+
console.log('-- SQL to migrate pg-boss (from version 0 to latest):');
|
|
284
|
+
console.log(migrationStore.migrate(schema, 0));
|
|
285
|
+
break;
|
|
286
|
+
case 'rollback':
|
|
287
|
+
console.log(`-- SQL to rollback pg-boss from version ${schemaVersion} to ${schemaVersion - 1}:`);
|
|
288
|
+
console.log(migrationStore.rollback(schema, schemaVersion));
|
|
289
|
+
break;
|
|
290
|
+
default:
|
|
291
|
+
console.error(`Unknown plans subcommand: ${subCommand}`);
|
|
292
|
+
console.error('Available: create, migrate, rollback');
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async function main() {
|
|
297
|
+
const args = parseCliArgs();
|
|
298
|
+
if (args.help || !args.command) {
|
|
299
|
+
printHelp();
|
|
300
|
+
process.exit(0);
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
switch (args.command) {
|
|
304
|
+
case 'version':
|
|
305
|
+
await cmdVersion(args);
|
|
306
|
+
break;
|
|
307
|
+
case 'create':
|
|
308
|
+
await cmdCreate(args);
|
|
309
|
+
break;
|
|
310
|
+
case 'migrate':
|
|
311
|
+
await cmdMigrate(args);
|
|
312
|
+
break;
|
|
313
|
+
case 'rollback':
|
|
314
|
+
await cmdRollback(args);
|
|
315
|
+
break;
|
|
316
|
+
case 'plans':
|
|
317
|
+
await cmdPlans(args);
|
|
318
|
+
break;
|
|
319
|
+
default:
|
|
320
|
+
console.error(`Unknown command: ${args.command}`);
|
|
321
|
+
console.error('Run "pg-boss --help" for available commands.');
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
console.error(`Error: ${err.message}`);
|
|
327
|
+
if (process.env.DEBUG) {
|
|
328
|
+
console.error(err.stack);
|
|
329
|
+
}
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
main();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type * as types from './types.ts';
|
|
2
|
+
declare class Contractor {
|
|
3
|
+
static constructionPlans(schema?: string, options?: {
|
|
4
|
+
createSchema: boolean;
|
|
5
|
+
}): string;
|
|
6
|
+
static migrationPlans(schema?: string, version?: number): string;
|
|
7
|
+
static rollbackPlans(schema?: string, version?: number): string;
|
|
8
|
+
private config;
|
|
9
|
+
private db;
|
|
10
|
+
private migrations;
|
|
11
|
+
constructor(db: types.IDatabase, config: types.ResolvedConstructorOptions);
|
|
12
|
+
schemaVersion(): Promise<number | null>;
|
|
13
|
+
isInstalled(): Promise<boolean>;
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
check(): Promise<void>;
|
|
16
|
+
create(): Promise<void>;
|
|
17
|
+
migrate(version: number): Promise<void>;
|
|
18
|
+
next(version: number): Promise<void>;
|
|
19
|
+
rollback(version: number): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export default Contractor;
|
|
22
|
+
//# sourceMappingURL=contractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractor.d.ts","sourceRoot":"","sources":["../src/contractor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAIxC,cAAM,UAAU;IACd,MAAM,CAAC,iBAAiB,CAAE,MAAM,SAAuB,EAAE,OAAO;;KAAyB;IAIzF,MAAM,CAAC,cAAc,CAAE,MAAM,SAAuB,EAAE,OAAO,SAAoB;IAIjF,MAAM,CAAC,aAAa,CAAE,MAAM,SAAuB,EAAE,OAAO,SAAgB;IAI5E,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,UAAU,CAAmB;gBAExB,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAMpE,aAAa;IAKb,WAAW;IAKX,KAAK;IAcL,KAAK;IAcL,MAAM;IASN,OAAO,CAAE,OAAO,EAAE,MAAM;IASxB,IAAI,CAAE,OAAO,EAAE,MAAM;IAKrB,QAAQ,CAAE,OAAO,EAAE,MAAM;CAIhC;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import * as plans from "./plans.js";
|
|
3
|
+
import * as migrationStore from "./migrationStore.js";
|
|
4
|
+
import packageJson from '../package.json' with { type: 'json' };
|
|
5
|
+
const schemaVersion = packageJson.pgboss.schema;
|
|
6
|
+
class Contractor {
|
|
7
|
+
static constructionPlans(schema = plans.DEFAULT_SCHEMA, options = { createSchema: true }) {
|
|
8
|
+
return plans.create(schema, schemaVersion, options);
|
|
9
|
+
}
|
|
10
|
+
static migrationPlans(schema = plans.DEFAULT_SCHEMA, version = schemaVersion - 1) {
|
|
11
|
+
return migrationStore.migrate(schema, version);
|
|
12
|
+
}
|
|
13
|
+
static rollbackPlans(schema = plans.DEFAULT_SCHEMA, version = schemaVersion) {
|
|
14
|
+
return migrationStore.rollback(schema, version);
|
|
15
|
+
}
|
|
16
|
+
config;
|
|
17
|
+
db;
|
|
18
|
+
migrations;
|
|
19
|
+
constructor(db, config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.db = db;
|
|
22
|
+
this.migrations = this.config.migrations || migrationStore.getAll(this.config.schema);
|
|
23
|
+
}
|
|
24
|
+
async schemaVersion() {
|
|
25
|
+
const result = await this.db.executeSql(plans.getVersion(this.config.schema));
|
|
26
|
+
return result.rows.length ? parseInt(result.rows[0].version) : null;
|
|
27
|
+
}
|
|
28
|
+
async isInstalled() {
|
|
29
|
+
const result = await this.db.executeSql(plans.versionTableExists(this.config.schema));
|
|
30
|
+
return !!result.rows[0].name;
|
|
31
|
+
}
|
|
32
|
+
async start() {
|
|
33
|
+
const installed = await this.isInstalled();
|
|
34
|
+
if (installed) {
|
|
35
|
+
const version = await this.schemaVersion();
|
|
36
|
+
if (version !== null && schemaVersion > version) {
|
|
37
|
+
await this.migrate(version);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
await this.create();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async check() {
|
|
45
|
+
const installed = await this.isInstalled();
|
|
46
|
+
if (!installed) {
|
|
47
|
+
throw new Error('pg-boss is not installed');
|
|
48
|
+
}
|
|
49
|
+
const version = await this.schemaVersion();
|
|
50
|
+
if (schemaVersion !== version) {
|
|
51
|
+
throw new Error('pg-boss database requires migrations');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async create() {
|
|
55
|
+
try {
|
|
56
|
+
const commands = plans.create(this.config.schema, schemaVersion, this.config);
|
|
57
|
+
await this.db.executeSql(commands);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
assert(err.message.includes(plans.CREATE_RACE_MESSAGE), err);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async migrate(version) {
|
|
64
|
+
try {
|
|
65
|
+
const commands = migrationStore.migrate(this.config.schema, version, this.migrations);
|
|
66
|
+
await this.db.executeSql(commands);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
assert(err.message.includes(plans.MIGRATE_RACE_MESSAGE), err);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async next(version) {
|
|
73
|
+
const commands = migrationStore.next(this.config.schema, version, this.migrations);
|
|
74
|
+
await this.db.executeSql(commands);
|
|
75
|
+
}
|
|
76
|
+
async rollback(version) {
|
|
77
|
+
const commands = migrationStore.rollback(this.config.schema, version, this.migrations);
|
|
78
|
+
await this.db.executeSql(commands);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export default Contractor;
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import type * as types from './types.ts';
|
|
3
|
+
declare class Db extends EventEmitter implements types.IDatabase, types.EventsMixin {
|
|
4
|
+
private pool;
|
|
5
|
+
private config;
|
|
6
|
+
opened: boolean;
|
|
7
|
+
constructor(config: types.DatabaseOptions);
|
|
8
|
+
events: {
|
|
9
|
+
error: string;
|
|
10
|
+
};
|
|
11
|
+
open(): Promise<void>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
executeSql(text: string, values?: unknown[]): Promise<import("pg").QueryResult<any>>;
|
|
14
|
+
}
|
|
15
|
+
export default Db;
|
|
16
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,cAAM,EAAG,SAAQ,YAAa,YAAW,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW;IACzE,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAuB;IAGrC,MAAM,EAAE,OAAO,CAAA;gBAEF,MAAM,EAAE,KAAK,CAAC,eAAe;IAY1C,MAAM;;MAEL;IAEK,IAAI;IAMJ,KAAK;IAOL,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;CAenD;AAED,eAAe,EAAE,CAAA"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import pg from 'pg';
|
|
3
|
+
import assert from 'node:assert';
|
|
4
|
+
class Db extends EventEmitter {
|
|
5
|
+
pool;
|
|
6
|
+
config;
|
|
7
|
+
/** @internal */
|
|
8
|
+
_pgbdb;
|
|
9
|
+
opened;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super();
|
|
12
|
+
config.application_name = config.application_name || 'pgboss';
|
|
13
|
+
config.connectionTimeoutMillis = config.connectionTimeoutMillis || 10000;
|
|
14
|
+
// config.maxUses = config.maxUses || 1000
|
|
15
|
+
this.config = config;
|
|
16
|
+
this._pgbdb = true;
|
|
17
|
+
this.opened = false;
|
|
18
|
+
}
|
|
19
|
+
events = {
|
|
20
|
+
error: 'error'
|
|
21
|
+
};
|
|
22
|
+
async open() {
|
|
23
|
+
this.pool = new pg.Pool(this.config);
|
|
24
|
+
this.pool.on('error', error => this.emit('error', error));
|
|
25
|
+
this.opened = true;
|
|
26
|
+
}
|
|
27
|
+
async close() {
|
|
28
|
+
if (!this.pool.ending) {
|
|
29
|
+
this.opened = false;
|
|
30
|
+
await this.pool.end();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async executeSql(text, values) {
|
|
34
|
+
assert(this.opened, 'Database not opened. Call open() before executing SQL.');
|
|
35
|
+
// if (this.config.debug === true) {
|
|
36
|
+
// console.log(`${new Date().toISOString()}: DEBUG SQL`)
|
|
37
|
+
// console.log(text)
|
|
38
|
+
// if (values) {
|
|
39
|
+
// console.log(`${new Date().toISOString()}: DEBUG VALUES`)
|
|
40
|
+
// console.log(values)
|
|
41
|
+
// }
|
|
42
|
+
// }
|
|
43
|
+
return await this.pool.query(text, values);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export default Db;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import type * as types from './types.ts';
|
|
3
|
+
import type { JobSpyInterface } from './spy.ts';
|
|
4
|
+
export { JOB_STATES as states } from './plans.ts';
|
|
5
|
+
export { QUEUE_POLICIES as policies } from './plans.ts';
|
|
6
|
+
export declare const events: types.Events;
|
|
7
|
+
export declare function getConstructionPlans(schema?: string): string;
|
|
8
|
+
export declare function getMigrationPlans(schema?: string, version?: number): string;
|
|
9
|
+
export declare function getRollbackPlans(schema?: string, version?: number): string;
|
|
10
|
+
export declare class PgBoss extends EventEmitter<types.PgBossEventMap> {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(connectionString: string);
|
|
13
|
+
constructor(options: types.ConstructorOptions);
|
|
14
|
+
start(): Promise<this>;
|
|
15
|
+
stop(options?: types.StopOptions): Promise<void>;
|
|
16
|
+
send(request: types.Request): Promise<string | null>;
|
|
17
|
+
send(name: string, data?: object | null, options?: types.SendOptions): Promise<string | null>;
|
|
18
|
+
sendAfter(name: string, data: object | null, options: types.SendOptions | null, date: Date): Promise<string | null>;
|
|
19
|
+
sendAfter(name: string, data: object | null, options: types.SendOptions | null, dateString: string): Promise<string | null>;
|
|
20
|
+
sendAfter(name: string, data: object | null, options: types.SendOptions | null, seconds: number): Promise<string | null>;
|
|
21
|
+
sendThrottled(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
22
|
+
sendDebounced(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
23
|
+
insert(name: string, jobs: types.JobInsert[], options?: types.InsertOptions): Promise<string[] | null>;
|
|
24
|
+
fetch<T>(name: string, options: types.FetchOptions & {
|
|
25
|
+
includeMetadata: true;
|
|
26
|
+
}): Promise<types.JobWithMetadata<T>[]>;
|
|
27
|
+
fetch<T>(name: string, options?: types.FetchOptions): Promise<types.Job<T>[]>;
|
|
28
|
+
work<ReqData, ResData = any>(name: string, handler: types.WorkHandler<ReqData, ResData>): Promise<string>;
|
|
29
|
+
work<ReqData, ResData = any>(name: string, options: types.WorkOptions & {
|
|
30
|
+
includeMetadata: true;
|
|
31
|
+
}, handler: types.WorkWithMetadataHandler<ReqData, ResData>): Promise<string>;
|
|
32
|
+
work<ReqData, ResData = any>(name: string, options: types.WorkOptions, handler: types.WorkHandler<ReqData, ResData>): Promise<string>;
|
|
33
|
+
offWork(name: string, options?: types.OffWorkOptions): Promise<void>;
|
|
34
|
+
notifyWorker(workerId: string): void;
|
|
35
|
+
subscribe(event: string, name: string): Promise<void>;
|
|
36
|
+
unsubscribe(event: string, name: string): Promise<void>;
|
|
37
|
+
publish(event: string, data?: object, options?: types.SendOptions): Promise<void>;
|
|
38
|
+
cancel(name: string, id: string | string[], options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
39
|
+
resume(name: string, id: string | string[], options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
40
|
+
retry(name: string, id: string | string[], options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
41
|
+
deleteJob(name: string, id: string | string[], options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
42
|
+
deleteQueuedJobs(name: string): Promise<void>;
|
|
43
|
+
deleteStoredJobs(name: string): Promise<void>;
|
|
44
|
+
deleteAllJobs(name?: string): Promise<void>;
|
|
45
|
+
complete(name: string, id: string | string[], data?: object | null, options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
46
|
+
fail(name: string, id: string | string[], data?: object | null, options?: types.ConnectionOptions): Promise<types.CommandResponse>;
|
|
47
|
+
/**
|
|
48
|
+
* @deprecated Use findJobs() instead
|
|
49
|
+
*/
|
|
50
|
+
getJobById<T>(name: string, id: string, options?: types.ConnectionOptions): Promise<types.JobWithMetadata<T> | null>;
|
|
51
|
+
findJobs<T>(name: string, options?: types.FindJobsOptions): Promise<types.JobWithMetadata<T>[]>;
|
|
52
|
+
createQueue(name: string, options?: Omit<types.Queue, 'name'>): Promise<void>;
|
|
53
|
+
updateQueue(name: string, options?: types.UpdateQueueOptions): Promise<void>;
|
|
54
|
+
deleteQueue(name: string): Promise<void>;
|
|
55
|
+
getQueues(names?: string[]): Promise<types.QueueResult[]>;
|
|
56
|
+
getQueue(name: string): Promise<types.QueueResult | null>;
|
|
57
|
+
getQueueStats(name: string): Promise<types.QueueResult>;
|
|
58
|
+
supervise(name?: string): Promise<void>;
|
|
59
|
+
getSpy<T = object>(name: string): JobSpyInterface<T>;
|
|
60
|
+
clearSpies(): void;
|
|
61
|
+
isInstalled(): Promise<boolean>;
|
|
62
|
+
schemaVersion(): Promise<number | null>;
|
|
63
|
+
schedule(name: string, cron: string, data?: object | null, options?: types.ScheduleOptions): Promise<void>;
|
|
64
|
+
unschedule(name: string, key?: string): Promise<void>;
|
|
65
|
+
getSchedules(name?: string, key?: string): Promise<types.Schedule[]>;
|
|
66
|
+
getBamStatus(): Promise<types.BamStatusSummary[]>;
|
|
67
|
+
getBamEntries(): Promise<types.BamEntry[]>;
|
|
68
|
+
getDb(): types.IDatabase;
|
|
69
|
+
}
|
|
70
|
+
export type { BamEntry, BamEvent, BamStatusSummary, ConnectionOptions, ConstructorOptions, FetchOptions, FindJobsOptions, IDatabase as Db, InsertOptions, Job, JobFetchOptions, JobInsert, JobPollingOptions, JobStates, Events, JobWithMetadata, MaintenanceOptions, OffWorkOptions, Queue, QueueOptions, QueuePolicy, QueueResult, Request, Schedule, ScheduleOptions, SchedulingOptions, SendOptions, StopOptions, WipData, WorkHandler, WorkOptions, WorkWithMetadataHandler, } from './types.ts';
|
|
71
|
+
export type { JobSpyInterface, JobSpyState, JobDataSelector, JobSelector, SpyJob, } from './spy.ts';
|
|
72
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|