@nicnocquee/dataqueue 1.20.0 → 1.22.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.
- package/dist/cli.cjs +6 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +185 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +48 -4
- package/dist/index.d.ts +48 -4
- package/dist/index.js +181 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +6 -0
- package/src/db-util.test.ts +56 -1
- package/src/db-util.ts +77 -6
- package/src/index.ts +19 -1
- package/src/queue.test.ts +449 -0
- package/src/queue.ts +147 -3
- package/src/types.ts +33 -3
package/dist/cli.cjs
CHANGED
|
@@ -36,6 +36,12 @@ function runCli(argv, {
|
|
|
36
36
|
log(
|
|
37
37
|
" - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string."
|
|
38
38
|
);
|
|
39
|
+
log(
|
|
40
|
+
" - For managed Postgres (e.g., DigitalOcean) with SSL, set PGSSLMODE=require and PGSSLROOTCERT to your CA .crt file."
|
|
41
|
+
);
|
|
42
|
+
log(
|
|
43
|
+
" Example: PGSSLMODE=require NODE_EXTRA_CA_CERTS=/absolute/path/to/ca.crt PG_DATAQUEUE_DATABASE=... npx dataqueue-cli migrate"
|
|
44
|
+
);
|
|
39
45
|
exit(1);
|
|
40
46
|
}
|
|
41
47
|
if (command === "migrate") {
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"names":["__filename","fileURLToPath","__dirname","path","spawnSync"],"mappings":";;;;;;;;;;;;AAKA,IAAMA,YAAA,GAAaC,iBAAA,CAAc,yPAAe,CAAA;AAChD,IAAMC,WAAA,GAAYC,qBAAA,CAAK,OAAA,CAAQH,YAAU,CAAA;AAUlC,SAAS,OACd,IAAA,EACA;AAAA,EACE,MAAM,OAAA,CAAQ,GAAA;AAAA,EACd,IAAA,GAAO,CAAC,IAAA,KAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC1C,aAAA,GAAgBI,uBAAA;AAAA,EAChB,aAAA,GAAgBD,qBAAA,CAAK,IAAA,CAAKD,WAAA,EAAW,eAAe;AACtD,CAAA,GAAa,EAAC,EACR;AACN,EAAA,MAAM,KAAK,OAAA,EAAS,GAAG,QAAQ,CAAA,GAAI,IAAA;AAEnC,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,UAAU,CAAA;AACd,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,QAAQ,CAAA;AACZ,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,IAAA,CAAK,CAAC,CAAA;AAAA;AAGR,EAAA,IAAI,YAAY,SAAA,EAAW;AAEzB,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG;AACzC,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,iBAAiB,CAAA;AAC1D,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,eAChB,WAAA,KAAgB,EAAA,IAAM,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,EAAG;AAC1D,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,WAAA,GAAc,CAAC,GAAG,iBAAiB,CAAA;AAC/D,MAAA,QAAA,CAAS,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA;AAIhC,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA,EAAG;AACrD,MAAA,UAAA,GAAa,CAAC,WAAA,EAAa,QAAA,CAAS,YAAA,GAAe,CAAC,CAAC,CAAA;AAAA;AAGvD,IAAA,MAAM,MAAA,GAAgC,aAAA;AAAA,MACpC,KAAA;AAAA,MACA;AAAA,QACE,iBAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,yBAAA;AAAA,QACA,IAAA;AAAA,QACA,uBAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAA;AAAA,QACA,GAAG,SAAA;AAAA,QACH,GAAG,UAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,EAAE,OAAO,SAAA;AAAU,KACrB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,GACzB,MAAO;AACL,IAAA,UAAA,EAAW;AAAA;AAEf","file":"cli.cjs","sourcesContent":["// Testable CLI logic for dataqueue\nimport { spawnSync, SpawnSyncReturns } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CliDeps {\n log?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n exit?: (code: number) => void;\n spawnSyncImpl?: (...args: any[]) => SpawnSyncReturns<any>;\n migrationsDir?: string;\n}\n\nexport function runCli(\n argv: string[],\n {\n log = console.log,\n exit = (code: number) => process.exit(code),\n spawnSyncImpl = spawnSync,\n migrationsDir = path.join(__dirname, '../migrations'),\n }: CliDeps = {},\n): void {\n const [, , command, ...restArgs] = argv;\n\n function printUsage() {\n log(\n 'Usage: dataqueue-cli migrate [--envPath <path>] [-s <schema> | --schema <schema>]',\n );\n log('');\n log('Options:');\n log(\n ' --envPath <path> Path to a .env file to load environment variables (passed to node-pg-migrate)',\n );\n log(\n ' -s, --schema <schema> Set the schema to use (passed to node-pg-migrate)',\n );\n log('');\n log('Notes:');\n log(\n ' - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string.',\n );\n exit(1);\n }\n\n if (command === 'migrate') {\n // Support for -s or --schema argument\n let schemaArg: string[] = [];\n const sIndex = restArgs.indexOf('-s');\n const schemaIndex = restArgs.indexOf('--schema');\n if (sIndex !== -1 && restArgs[sIndex + 1]) {\n schemaArg = ['-s', restArgs[sIndex + 1], '--create-schema'];\n restArgs.splice(sIndex, 2);\n } else if (schemaIndex !== -1 && restArgs[schemaIndex + 1]) {\n schemaArg = ['-s', restArgs[schemaIndex + 1], '--create-schema'];\n restArgs.splice(schemaIndex, 2);\n }\n\n // Support for --envPath argument\n let envPathArg: string[] = [];\n const envPathIndex = restArgs.indexOf('--envPath');\n if (envPathIndex !== -1 && restArgs[envPathIndex + 1]) {\n envPathArg = ['--envPath', restArgs[envPathIndex + 1]];\n }\n\n const result: SpawnSyncReturns<any> = spawnSyncImpl(\n 'npx',\n [\n 'node-pg-migrate',\n 'up',\n '-t',\n 'dataqueuedev_migrations',\n '-d',\n 'PG_DATAQUEUE_DATABASE',\n '-m',\n migrationsDir,\n ...schemaArg,\n ...envPathArg,\n ...restArgs,\n ],\n { stdio: 'inherit' },\n );\n exit(result.status ?? 1);\n } else {\n printUsage();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"names":["__filename","fileURLToPath","__dirname","path","spawnSync"],"mappings":";;;;;;;;;;;;AAKA,IAAMA,YAAA,GAAaC,iBAAA,CAAc,yPAAe,CAAA;AAChD,IAAMC,WAAA,GAAYC,qBAAA,CAAK,OAAA,CAAQH,YAAU,CAAA;AAUlC,SAAS,OACd,IAAA,EACA;AAAA,EACE,MAAM,OAAA,CAAQ,GAAA;AAAA,EACd,IAAA,GAAO,CAAC,IAAA,KAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC1C,aAAA,GAAgBI,uBAAA;AAAA,EAChB,aAAA,GAAgBD,qBAAA,CAAK,IAAA,CAAKD,WAAA,EAAW,eAAe;AACtD,CAAA,GAAa,EAAC,EACR;AACN,EAAA,MAAM,KAAK,OAAA,EAAS,GAAG,QAAQ,CAAA,GAAI,IAAA;AAEnC,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,UAAU,CAAA;AACd,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,QAAQ,CAAA;AACZ,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,IAAA,CAAK,CAAC,CAAA;AAAA;AAGR,EAAA,IAAI,YAAY,SAAA,EAAW;AAEzB,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG;AACzC,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,iBAAiB,CAAA;AAC1D,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,eAChB,WAAA,KAAgB,EAAA,IAAM,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,EAAG;AAC1D,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,WAAA,GAAc,CAAC,GAAG,iBAAiB,CAAA;AAC/D,MAAA,QAAA,CAAS,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA;AAIhC,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA,EAAG;AACrD,MAAA,UAAA,GAAa,CAAC,WAAA,EAAa,QAAA,CAAS,YAAA,GAAe,CAAC,CAAC,CAAA;AAAA;AAGvD,IAAA,MAAM,MAAA,GAAgC,aAAA;AAAA,MACpC,KAAA;AAAA,MACA;AAAA,QACE,iBAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,yBAAA;AAAA,QACA,IAAA;AAAA,QACA,uBAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAA;AAAA,QACA,GAAG,SAAA;AAAA,QACH,GAAG,UAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,EAAE,OAAO,SAAA;AAAU,KACrB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,GACzB,MAAO;AACL,IAAA,UAAA,EAAW;AAAA;AAEf","file":"cli.cjs","sourcesContent":["// Testable CLI logic for dataqueue\nimport { spawnSync, SpawnSyncReturns } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CliDeps {\n log?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n exit?: (code: number) => void;\n spawnSyncImpl?: (...args: any[]) => SpawnSyncReturns<any>;\n migrationsDir?: string;\n}\n\nexport function runCli(\n argv: string[],\n {\n log = console.log,\n exit = (code: number) => process.exit(code),\n spawnSyncImpl = spawnSync,\n migrationsDir = path.join(__dirname, '../migrations'),\n }: CliDeps = {},\n): void {\n const [, , command, ...restArgs] = argv;\n\n function printUsage() {\n log(\n 'Usage: dataqueue-cli migrate [--envPath <path>] [-s <schema> | --schema <schema>]',\n );\n log('');\n log('Options:');\n log(\n ' --envPath <path> Path to a .env file to load environment variables (passed to node-pg-migrate)',\n );\n log(\n ' -s, --schema <schema> Set the schema to use (passed to node-pg-migrate)',\n );\n log('');\n log('Notes:');\n log(\n ' - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string.',\n );\n log(\n ' - For managed Postgres (e.g., DigitalOcean) with SSL, set PGSSLMODE=require and PGSSLROOTCERT to your CA .crt file.',\n );\n log(\n ' Example: PGSSLMODE=require NODE_EXTRA_CA_CERTS=/absolute/path/to/ca.crt PG_DATAQUEUE_DATABASE=... npx dataqueue-cli migrate',\n );\n exit(1);\n }\n\n if (command === 'migrate') {\n // Support for -s or --schema argument\n let schemaArg: string[] = [];\n const sIndex = restArgs.indexOf('-s');\n const schemaIndex = restArgs.indexOf('--schema');\n if (sIndex !== -1 && restArgs[sIndex + 1]) {\n schemaArg = ['-s', restArgs[sIndex + 1], '--create-schema'];\n restArgs.splice(sIndex, 2);\n } else if (schemaIndex !== -1 && restArgs[schemaIndex + 1]) {\n schemaArg = ['-s', restArgs[schemaIndex + 1], '--create-schema'];\n restArgs.splice(schemaIndex, 2);\n }\n\n // Support for --envPath argument\n let envPathArg: string[] = [];\n const envPathIndex = restArgs.indexOf('--envPath');\n if (envPathIndex !== -1 && restArgs[envPathIndex + 1]) {\n envPathArg = ['--envPath', restArgs[envPathIndex + 1]];\n }\n\n const result: SpawnSyncReturns<any> = spawnSyncImpl(\n 'npx',\n [\n 'node-pg-migrate',\n 'up',\n '-t',\n 'dataqueuedev_migrations',\n '-d',\n 'PG_DATAQUEUE_DATABASE',\n '-m',\n migrationsDir,\n ...schemaArg,\n ...envPathArg,\n ...restArgs,\n ],\n { stdio: 'inherit' },\n );\n exit(result.status ?? 1);\n } else {\n printUsage();\n }\n}\n"]}
|
package/dist/cli.js
CHANGED
|
@@ -29,6 +29,12 @@ function runCli(argv, {
|
|
|
29
29
|
log(
|
|
30
30
|
" - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string."
|
|
31
31
|
);
|
|
32
|
+
log(
|
|
33
|
+
" - For managed Postgres (e.g., DigitalOcean) with SSL, set PGSSLMODE=require and PGSSLROOTCERT to your CA .crt file."
|
|
34
|
+
);
|
|
35
|
+
log(
|
|
36
|
+
" Example: PGSSLMODE=require NODE_EXTRA_CA_CERTS=/absolute/path/to/ca.crt PG_DATAQUEUE_DATABASE=... npx dataqueue-cli migrate"
|
|
37
|
+
);
|
|
32
38
|
exit(1);
|
|
33
39
|
}
|
|
34
40
|
if (command === "migrate") {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAUlC,SAAS,OACd,IAAA,EACA;AAAA,EACE,MAAM,OAAA,CAAQ,GAAA;AAAA,EACd,IAAA,GAAO,CAAC,IAAA,KAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC1C,aAAA,GAAgB,SAAA;AAAA,EAChB,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe;AACtD,CAAA,GAAa,EAAC,EACR;AACN,EAAA,MAAM,KAAK,OAAA,EAAS,GAAG,QAAQ,CAAA,GAAI,IAAA;AAEnC,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,UAAU,CAAA;AACd,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,QAAQ,CAAA;AACZ,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,IAAA,CAAK,CAAC,CAAA;AAAA;AAGR,EAAA,IAAI,YAAY,SAAA,EAAW;AAEzB,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG;AACzC,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,iBAAiB,CAAA;AAC1D,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,eAChB,WAAA,KAAgB,EAAA,IAAM,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,EAAG;AAC1D,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,WAAA,GAAc,CAAC,GAAG,iBAAiB,CAAA;AAC/D,MAAA,QAAA,CAAS,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA;AAIhC,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA,EAAG;AACrD,MAAA,UAAA,GAAa,CAAC,WAAA,EAAa,QAAA,CAAS,YAAA,GAAe,CAAC,CAAC,CAAA;AAAA;AAGvD,IAAA,MAAM,MAAA,GAAgC,aAAA;AAAA,MACpC,KAAA;AAAA,MACA;AAAA,QACE,iBAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,yBAAA;AAAA,QACA,IAAA;AAAA,QACA,uBAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAA;AAAA,QACA,GAAG,SAAA;AAAA,QACH,GAAG,UAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,EAAE,OAAO,SAAA;AAAU,KACrB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,GACzB,MAAO;AACL,IAAA,UAAA,EAAW;AAAA;AAEf","file":"cli.js","sourcesContent":["// Testable CLI logic for dataqueue\nimport { spawnSync, SpawnSyncReturns } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CliDeps {\n log?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n exit?: (code: number) => void;\n spawnSyncImpl?: (...args: any[]) => SpawnSyncReturns<any>;\n migrationsDir?: string;\n}\n\nexport function runCli(\n argv: string[],\n {\n log = console.log,\n exit = (code: number) => process.exit(code),\n spawnSyncImpl = spawnSync,\n migrationsDir = path.join(__dirname, '../migrations'),\n }: CliDeps = {},\n): void {\n const [, , command, ...restArgs] = argv;\n\n function printUsage() {\n log(\n 'Usage: dataqueue-cli migrate [--envPath <path>] [-s <schema> | --schema <schema>]',\n );\n log('');\n log('Options:');\n log(\n ' --envPath <path> Path to a .env file to load environment variables (passed to node-pg-migrate)',\n );\n log(\n ' -s, --schema <schema> Set the schema to use (passed to node-pg-migrate)',\n );\n log('');\n log('Notes:');\n log(\n ' - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string.',\n );\n exit(1);\n }\n\n if (command === 'migrate') {\n // Support for -s or --schema argument\n let schemaArg: string[] = [];\n const sIndex = restArgs.indexOf('-s');\n const schemaIndex = restArgs.indexOf('--schema');\n if (sIndex !== -1 && restArgs[sIndex + 1]) {\n schemaArg = ['-s', restArgs[sIndex + 1], '--create-schema'];\n restArgs.splice(sIndex, 2);\n } else if (schemaIndex !== -1 && restArgs[schemaIndex + 1]) {\n schemaArg = ['-s', restArgs[schemaIndex + 1], '--create-schema'];\n restArgs.splice(schemaIndex, 2);\n }\n\n // Support for --envPath argument\n let envPathArg: string[] = [];\n const envPathIndex = restArgs.indexOf('--envPath');\n if (envPathIndex !== -1 && restArgs[envPathIndex + 1]) {\n envPathArg = ['--envPath', restArgs[envPathIndex + 1]];\n }\n\n const result: SpawnSyncReturns<any> = spawnSyncImpl(\n 'npx',\n [\n 'node-pg-migrate',\n 'up',\n '-t',\n 'dataqueuedev_migrations',\n '-d',\n 'PG_DATAQUEUE_DATABASE',\n '-m',\n migrationsDir,\n ...schemaArg,\n ...envPathArg,\n ...restArgs,\n ],\n { stdio: 'inherit' },\n );\n exit(result.status ?? 1);\n } else {\n printUsage();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAUlC,SAAS,OACd,IAAA,EACA;AAAA,EACE,MAAM,OAAA,CAAQ,GAAA;AAAA,EACd,IAAA,GAAO,CAAC,IAAA,KAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC1C,aAAA,GAAgB,SAAA;AAAA,EAChB,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe;AACtD,CAAA,GAAa,EAAC,EACR;AACN,EAAA,MAAM,KAAK,OAAA,EAAS,GAAG,QAAQ,CAAA,GAAI,IAAA;AAEnC,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,UAAU,CAAA;AACd,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,QAAQ,CAAA;AACZ,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,GAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,IAAA,CAAK,CAAC,CAAA;AAAA;AAGR,EAAA,IAAI,YAAY,SAAA,EAAW;AAEzB,IAAA,IAAI,YAAsB,EAAC;AAC3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG;AACzC,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,iBAAiB,CAAA;AAC1D,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,eAChB,WAAA,KAAgB,EAAA,IAAM,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,EAAG;AAC1D,MAAA,SAAA,GAAY,CAAC,IAAA,EAAM,QAAA,CAAS,WAAA,GAAc,CAAC,GAAG,iBAAiB,CAAA;AAC/D,MAAA,QAAA,CAAS,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA;AAIhC,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA,EAAG;AACrD,MAAA,UAAA,GAAa,CAAC,WAAA,EAAa,QAAA,CAAS,YAAA,GAAe,CAAC,CAAC,CAAA;AAAA;AAGvD,IAAA,MAAM,MAAA,GAAgC,aAAA;AAAA,MACpC,KAAA;AAAA,MACA;AAAA,QACE,iBAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,yBAAA;AAAA,QACA,IAAA;AAAA,QACA,uBAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAA;AAAA,QACA,GAAG,SAAA;AAAA,QACH,GAAG,UAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,EAAE,OAAO,SAAA;AAAU,KACrB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,GACzB,MAAO;AACL,IAAA,UAAA,EAAW;AAAA;AAEf","file":"cli.js","sourcesContent":["// Testable CLI logic for dataqueue\nimport { spawnSync, SpawnSyncReturns } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CliDeps {\n log?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n exit?: (code: number) => void;\n spawnSyncImpl?: (...args: any[]) => SpawnSyncReturns<any>;\n migrationsDir?: string;\n}\n\nexport function runCli(\n argv: string[],\n {\n log = console.log,\n exit = (code: number) => process.exit(code),\n spawnSyncImpl = spawnSync,\n migrationsDir = path.join(__dirname, '../migrations'),\n }: CliDeps = {},\n): void {\n const [, , command, ...restArgs] = argv;\n\n function printUsage() {\n log(\n 'Usage: dataqueue-cli migrate [--envPath <path>] [-s <schema> | --schema <schema>]',\n );\n log('');\n log('Options:');\n log(\n ' --envPath <path> Path to a .env file to load environment variables (passed to node-pg-migrate)',\n );\n log(\n ' -s, --schema <schema> Set the schema to use (passed to node-pg-migrate)',\n );\n log('');\n log('Notes:');\n log(\n ' - The PG_DATAQUEUE_DATABASE environment variable must be set to your Postgres connection string.',\n );\n log(\n ' - For managed Postgres (e.g., DigitalOcean) with SSL, set PGSSLMODE=require and PGSSLROOTCERT to your CA .crt file.',\n );\n log(\n ' Example: PGSSLMODE=require NODE_EXTRA_CA_CERTS=/absolute/path/to/ca.crt PG_DATAQUEUE_DATABASE=... npx dataqueue-cli migrate',\n );\n exit(1);\n }\n\n if (command === 'migrate') {\n // Support for -s or --schema argument\n let schemaArg: string[] = [];\n const sIndex = restArgs.indexOf('-s');\n const schemaIndex = restArgs.indexOf('--schema');\n if (sIndex !== -1 && restArgs[sIndex + 1]) {\n schemaArg = ['-s', restArgs[sIndex + 1], '--create-schema'];\n restArgs.splice(sIndex, 2);\n } else if (schemaIndex !== -1 && restArgs[schemaIndex + 1]) {\n schemaArg = ['-s', restArgs[schemaIndex + 1], '--create-schema'];\n restArgs.splice(schemaIndex, 2);\n }\n\n // Support for --envPath argument\n let envPathArg: string[] = [];\n const envPathIndex = restArgs.indexOf('--envPath');\n if (envPathIndex !== -1 && restArgs[envPathIndex + 1]) {\n envPathArg = ['--envPath', restArgs[envPathIndex + 1]];\n }\n\n const result: SpawnSyncReturns<any> = spawnSyncImpl(\n 'npx',\n [\n 'node-pg-migrate',\n 'up',\n '-t',\n 'dataqueuedev_migrations',\n '-d',\n 'PG_DATAQUEUE_DATABASE',\n '-m',\n migrationsDir,\n ...schemaArg,\n ...envPathArg,\n ...restArgs,\n ],\n { stdio: 'inherit' },\n );\n exit(result.status ?? 1);\n } else {\n printUsage();\n }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
var async_hooks = require('async_hooks');
|
|
4
4
|
var pg = require('pg');
|
|
5
5
|
var pgConnectionString = require('pg-connection-string');
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
6
11
|
|
|
7
12
|
// src/types.ts
|
|
8
13
|
var JobEventType = /* @__PURE__ */ ((JobEventType2) => {
|
|
@@ -358,8 +363,32 @@ var cancelAllUpcomingJobs = async (pool, filters) => {
|
|
|
358
363
|
params.push(filters.priority);
|
|
359
364
|
}
|
|
360
365
|
if (filters.runAt) {
|
|
361
|
-
|
|
362
|
-
|
|
366
|
+
if (filters.runAt instanceof Date) {
|
|
367
|
+
query += ` AND run_at = $${paramIdx++}`;
|
|
368
|
+
params.push(filters.runAt);
|
|
369
|
+
} else if (typeof filters.runAt === "object") {
|
|
370
|
+
const ops = filters.runAt;
|
|
371
|
+
if (ops.gt) {
|
|
372
|
+
query += ` AND run_at > $${paramIdx++}`;
|
|
373
|
+
params.push(ops.gt);
|
|
374
|
+
}
|
|
375
|
+
if (ops.gte) {
|
|
376
|
+
query += ` AND run_at >= $${paramIdx++}`;
|
|
377
|
+
params.push(ops.gte);
|
|
378
|
+
}
|
|
379
|
+
if (ops.lt) {
|
|
380
|
+
query += ` AND run_at < $${paramIdx++}`;
|
|
381
|
+
params.push(ops.lt);
|
|
382
|
+
}
|
|
383
|
+
if (ops.lte) {
|
|
384
|
+
query += ` AND run_at <= $${paramIdx++}`;
|
|
385
|
+
params.push(ops.lte);
|
|
386
|
+
}
|
|
387
|
+
if (ops.eq) {
|
|
388
|
+
query += ` AND run_at = $${paramIdx++}`;
|
|
389
|
+
params.push(ops.eq);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
363
392
|
}
|
|
364
393
|
if (filters.tags && filters.tags.values && filters.tags.values.length > 0) {
|
|
365
394
|
const mode = filters.tags.mode || "all";
|
|
@@ -521,6 +550,97 @@ var getJobsByTags = async (pool, tags, mode = "all", limit = 100, offset = 0) =>
|
|
|
521
550
|
client.release();
|
|
522
551
|
}
|
|
523
552
|
};
|
|
553
|
+
var getJobs = async (pool, filters, limit = 100, offset = 0) => {
|
|
554
|
+
const client = await pool.connect();
|
|
555
|
+
try {
|
|
556
|
+
let query = `SELECT id, job_type AS "jobType", payload, status, max_attempts AS "maxAttempts", attempts, priority, run_at AS "runAt", timeout_ms AS "timeoutMs", created_at AS "createdAt", updated_at AS "updatedAt", started_at AS "startedAt", completed_at AS "completedAt", last_failed_at AS "lastFailedAt", locked_at AS "lockedAt", locked_by AS "lockedBy", error_history AS "errorHistory", failure_reason AS "failureReason", next_attempt_at AS "nextAttemptAt", last_failed_at AS "lastFailedAt", last_retried_at AS "lastRetriedAt", last_cancelled_at AS "lastCancelledAt", pending_reason AS "pendingReason", tags FROM job_queue`;
|
|
557
|
+
const params = [];
|
|
558
|
+
let where = [];
|
|
559
|
+
let paramIdx = 1;
|
|
560
|
+
if (filters) {
|
|
561
|
+
if (filters.jobType) {
|
|
562
|
+
where.push(`job_type = $${paramIdx++}`);
|
|
563
|
+
params.push(filters.jobType);
|
|
564
|
+
}
|
|
565
|
+
if (filters.priority !== void 0) {
|
|
566
|
+
where.push(`priority = $${paramIdx++}`);
|
|
567
|
+
params.push(filters.priority);
|
|
568
|
+
}
|
|
569
|
+
if (filters.runAt) {
|
|
570
|
+
if (filters.runAt instanceof Date) {
|
|
571
|
+
where.push(`run_at = $${paramIdx++}`);
|
|
572
|
+
params.push(filters.runAt);
|
|
573
|
+
} else if (typeof filters.runAt === "object" && (filters.runAt.gt !== void 0 || filters.runAt.gte !== void 0 || filters.runAt.lt !== void 0 || filters.runAt.lte !== void 0 || filters.runAt.eq !== void 0)) {
|
|
574
|
+
const ops = filters.runAt;
|
|
575
|
+
if (ops.gt) {
|
|
576
|
+
where.push(`run_at > $${paramIdx++}`);
|
|
577
|
+
params.push(ops.gt);
|
|
578
|
+
}
|
|
579
|
+
if (ops.gte) {
|
|
580
|
+
where.push(`run_at >= $${paramIdx++}`);
|
|
581
|
+
params.push(ops.gte);
|
|
582
|
+
}
|
|
583
|
+
if (ops.lt) {
|
|
584
|
+
where.push(`run_at < $${paramIdx++}`);
|
|
585
|
+
params.push(ops.lt);
|
|
586
|
+
}
|
|
587
|
+
if (ops.lte) {
|
|
588
|
+
where.push(`run_at <= $${paramIdx++}`);
|
|
589
|
+
params.push(ops.lte);
|
|
590
|
+
}
|
|
591
|
+
if (ops.eq) {
|
|
592
|
+
where.push(`run_at = $${paramIdx++}`);
|
|
593
|
+
params.push(ops.eq);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
if (filters.tags && filters.tags.values && filters.tags.values.length > 0) {
|
|
598
|
+
const mode = filters.tags.mode || "all";
|
|
599
|
+
const tagValues = filters.tags.values;
|
|
600
|
+
switch (mode) {
|
|
601
|
+
case "exact":
|
|
602
|
+
where.push(`tags = $${paramIdx++}`);
|
|
603
|
+
params.push(tagValues);
|
|
604
|
+
break;
|
|
605
|
+
case "all":
|
|
606
|
+
where.push(`tags @> $${paramIdx++}`);
|
|
607
|
+
params.push(tagValues);
|
|
608
|
+
break;
|
|
609
|
+
case "any":
|
|
610
|
+
where.push(`tags && $${paramIdx++}`);
|
|
611
|
+
params.push(tagValues);
|
|
612
|
+
break;
|
|
613
|
+
case "none":
|
|
614
|
+
where.push(`NOT (tags && $${paramIdx++})`);
|
|
615
|
+
params.push(tagValues);
|
|
616
|
+
break;
|
|
617
|
+
default:
|
|
618
|
+
where.push(`tags @> $${paramIdx++}`);
|
|
619
|
+
params.push(tagValues);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
if (where.length > 0) {
|
|
624
|
+
query += ` WHERE ${where.join(" AND ")}`;
|
|
625
|
+
}
|
|
626
|
+
paramIdx = params.length + 1;
|
|
627
|
+
query += ` ORDER BY created_at DESC LIMIT $${paramIdx++} OFFSET $${paramIdx}`;
|
|
628
|
+
params.push(limit, offset);
|
|
629
|
+
const result = await client.query(query, params);
|
|
630
|
+
log(`Found ${result.rows.length} jobs`);
|
|
631
|
+
return result.rows.map((job) => ({
|
|
632
|
+
...job,
|
|
633
|
+
payload: job.payload,
|
|
634
|
+
timeoutMs: job.timeoutMs,
|
|
635
|
+
failureReason: job.failureReason
|
|
636
|
+
}));
|
|
637
|
+
} catch (error) {
|
|
638
|
+
log(`Error getting jobs: ${error}`);
|
|
639
|
+
throw error;
|
|
640
|
+
} finally {
|
|
641
|
+
client.release();
|
|
642
|
+
}
|
|
643
|
+
};
|
|
524
644
|
|
|
525
645
|
// src/processor.ts
|
|
526
646
|
async function processJobWithHandlers(pool, job, jobHandlers) {
|
|
@@ -692,12 +812,27 @@ var createProcessor = (pool, handlers, options = {}) => {
|
|
|
692
812
|
isRunning: () => running
|
|
693
813
|
};
|
|
694
814
|
};
|
|
815
|
+
function loadPemOrFile(value) {
|
|
816
|
+
if (!value) return void 0;
|
|
817
|
+
if (value.startsWith("file://")) {
|
|
818
|
+
const filePath = value.slice(7);
|
|
819
|
+
return fs__default.default.readFileSync(filePath, "utf8");
|
|
820
|
+
}
|
|
821
|
+
return value;
|
|
822
|
+
}
|
|
695
823
|
var createPool = (config) => {
|
|
696
824
|
let searchPath;
|
|
825
|
+
let ssl = void 0;
|
|
826
|
+
let customCA;
|
|
827
|
+
let sslmode;
|
|
697
828
|
if (config.connectionString) {
|
|
698
829
|
try {
|
|
699
830
|
const url = new URL(config.connectionString);
|
|
700
831
|
searchPath = url.searchParams.get("search_path") || void 0;
|
|
832
|
+
sslmode = url.searchParams.get("sslmode") || void 0;
|
|
833
|
+
if (sslmode === "no-verify") {
|
|
834
|
+
ssl = { rejectUnauthorized: false };
|
|
835
|
+
}
|
|
701
836
|
} catch (e) {
|
|
702
837
|
const parsed = pgConnectionString.parse(config.connectionString);
|
|
703
838
|
if (parsed.options) {
|
|
@@ -706,9 +841,52 @@ var createPool = (config) => {
|
|
|
706
841
|
searchPath = match[1];
|
|
707
842
|
}
|
|
708
843
|
}
|
|
844
|
+
sslmode = typeof parsed.sslmode === "string" ? parsed.sslmode : void 0;
|
|
845
|
+
if (sslmode === "no-verify") {
|
|
846
|
+
ssl = { rejectUnauthorized: false };
|
|
847
|
+
}
|
|
709
848
|
}
|
|
710
849
|
}
|
|
711
|
-
|
|
850
|
+
if (config.ssl) {
|
|
851
|
+
if (typeof config.ssl.ca === "string") {
|
|
852
|
+
customCA = config.ssl.ca;
|
|
853
|
+
} else if (typeof process.env.PGSSLROOTCERT === "string") {
|
|
854
|
+
customCA = process.env.PGSSLROOTCERT;
|
|
855
|
+
} else {
|
|
856
|
+
customCA = void 0;
|
|
857
|
+
}
|
|
858
|
+
const caValue = typeof customCA === "string" ? loadPemOrFile(customCA) : void 0;
|
|
859
|
+
ssl = {
|
|
860
|
+
...ssl,
|
|
861
|
+
...caValue ? { ca: caValue } : {},
|
|
862
|
+
cert: loadPemOrFile(
|
|
863
|
+
typeof config.ssl.cert === "string" ? config.ssl.cert : process.env.PGSSLCERT
|
|
864
|
+
),
|
|
865
|
+
key: loadPemOrFile(
|
|
866
|
+
typeof config.ssl.key === "string" ? config.ssl.key : process.env.PGSSLKEY
|
|
867
|
+
),
|
|
868
|
+
rejectUnauthorized: config.ssl.rejectUnauthorized !== void 0 ? config.ssl.rejectUnauthorized : true
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
if (sslmode && customCA) {
|
|
872
|
+
const warning = `
|
|
873
|
+
|
|
874
|
+
\x1B[33m**************************************************
|
|
875
|
+
\u26A0\uFE0F WARNING: SSL CONFIGURATION ISSUE
|
|
876
|
+
**************************************************
|
|
877
|
+
Both sslmode ('${sslmode}') is set in the connection string
|
|
878
|
+
and a custom CA is provided (via config.ssl.ca or PGSSLROOTCERT).
|
|
879
|
+
This combination may cause connection failures or unexpected behavior.
|
|
880
|
+
|
|
881
|
+
Recommended: Remove sslmode from the connection string when using a custom CA.
|
|
882
|
+
**************************************************\x1B[0m
|
|
883
|
+
`;
|
|
884
|
+
console.warn(warning);
|
|
885
|
+
}
|
|
886
|
+
const pool = new pg.Pool({
|
|
887
|
+
...config,
|
|
888
|
+
...ssl ? { ssl } : {}
|
|
889
|
+
});
|
|
712
890
|
if (searchPath) {
|
|
713
891
|
pool.on("connect", (client) => {
|
|
714
892
|
client.query(`SET search_path TO ${searchPath}`);
|
|
@@ -740,6 +918,10 @@ var initJobQueue = (config) => {
|
|
|
740
918
|
(limit, offset) => getAllJobs(pool, limit, offset),
|
|
741
919
|
config.verbose ?? false
|
|
742
920
|
),
|
|
921
|
+
getJobs: withLogContext(
|
|
922
|
+
(filters, limit, offset) => getJobs(pool, filters, limit, offset),
|
|
923
|
+
config.verbose ?? false
|
|
924
|
+
),
|
|
743
925
|
retryJob: (jobId) => retryJob(pool, jobId),
|
|
744
926
|
cleanupOldJobs: (daysToKeep) => cleanupOldJobs(pool, daysToKeep),
|
|
745
927
|
cancelJob: withLogContext(
|