@nebutra/queue 0.1.3 → 2.0.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/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/queuebase-webhook.d.ts +12 -0
- package/dist/queuebase-webhook.d.ts.map +1 -1
- package/dist/queuebase-webhook.js +26 -1
- package/dist/queuebase.d.ts +1 -1
- package/dist/queuebase.d.ts.map +1 -1
- package/dist/queuebase.js +1 -1
- package/dist/scheduled/index.d.ts +14 -6
- package/dist/scheduled/index.d.ts.map +1 -1
- package/dist/scheduled/index.js +10 -9
- package/dist/scheduled/jobs/invitation-cleanup.d.ts +9 -4
- package/dist/scheduled/jobs/invitation-cleanup.d.ts.map +1 -1
- package/dist/scheduled/jobs/invitation-cleanup.js +20 -6
- package/dist/scheduled/jobs/session-cleanup.d.ts +11 -2
- package/dist/scheduled/jobs/session-cleanup.d.ts.map +1 -1
- package/dist/scheduled/jobs/session-cleanup.js +21 -3
- package/package.json +7 -13
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ export { BullMQProvider } from "./providers/bullmq";
|
|
|
4
4
|
export { MemoryProvider } from "./providers/memory";
|
|
5
5
|
export { getQStashHandler, getQStashHandlerKeys, QStashProvider } from "./providers/qstash";
|
|
6
6
|
export type { QueuebaseBackoff, QueuebaseClient, QueuebaseClientOptions, QueuebaseEnqueueResult, QueuebaseJobContext, QueuebaseJobDefinition, QueuebaseJobRouter, QueuebaseJobs, QueuebaseSchedule, QueuebaseScheduleConfig, QueuebaseScheduleMetadata, } from "./queuebase";
|
|
7
|
-
export { createJobClient, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, getQueuebaseCallbackUrl, listQueuebaseSchedules, queuebaseJobClient, queuebaseJobs, queuebaseWebhookHandler, } from "./queuebase";
|
|
8
|
-
export type { ScheduledJob, ScheduledJobResult } from "./scheduled/index";
|
|
9
|
-
export { clearScheduledJobs, getScheduledJob, invitationCleanup, listScheduledJobs, registerDefaultScheduledJobs, registerScheduledJob, runInvitationCleanup, runSessionCleanup, sessionCleanup, } from "./scheduled/index";
|
|
7
|
+
export { createDefaultQueuebaseJobs, createJobClient, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, getQueuebaseCallbackUrl, listQueuebaseSchedules, queuebaseJobClient, queuebaseJobs, queuebaseWebhookHandler, } from "./queuebase";
|
|
8
|
+
export type { InvitationCleanupClient, RegisterDefaultScheduledJobsOptions, ScheduledJob, ScheduledJobResult, SessionCleanupClient, } from "./scheduled/index";
|
|
9
|
+
export { clearScheduledJobs, createInvitationCleanup, createSessionCleanup, getScheduledJob, invitationCleanup, listScheduledJobs, registerDefaultScheduledJobs, registerScheduledJob, runInvitationCleanup, runSessionCleanup, sessionCleanup, } from "./scheduled/index";
|
|
10
10
|
export type { BullMQProviderConfig, DeadLetterJob, JobHandler, JobLifecycleAction, JobLifecycleActionResult, JobLifecycleEvent, JobOptions, JobPayload, JobResult, JobStatus, JobStatusInfo, MemoryProviderConfig, QStashProviderConfig, QueueConfig, QueueProvider, QueueProviderType, } from "./types";
|
|
11
11
|
export { JobOptionsSchema, JobPayloadSchema } from "./types";
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,QAAQ,GACT,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5F,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,cAAc,EACd,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,GACxB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,QAAQ,GACT,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5F,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,cAAc,EACd,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,uBAAuB,EACvB,mCAAmC,EACnC,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,6 @@ export { MemoryProvider } from "./providers/memory";
|
|
|
21
21
|
// ── Providers (tree-shakable direct imports) ────────────────────────────────
|
|
22
22
|
export { getQStashHandler, getQStashHandlerKeys, QStashProvider } from "./providers/qstash";
|
|
23
23
|
// ── Queuebase-style typed jobs ──────────────────────────────────────────────
|
|
24
|
-
export { createJobClient, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, getQueuebaseCallbackUrl, listQueuebaseSchedules, queuebaseJobClient, queuebaseJobs, queuebaseWebhookHandler, } from "./queuebase";
|
|
25
|
-
|
|
26
|
-
export { clearScheduledJobs, getScheduledJob, invitationCleanup, listScheduledJobs, registerDefaultScheduledJobs, registerScheduledJob, runInvitationCleanup, runSessionCleanup, sessionCleanup, } from "./scheduled/index";
|
|
24
|
+
export { createDefaultQueuebaseJobs, createJobClient, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, getQueuebaseCallbackUrl, listQueuebaseSchedules, queuebaseJobClient, queuebaseJobs, queuebaseWebhookHandler, } from "./queuebase";
|
|
25
|
+
export { clearScheduledJobs, createInvitationCleanup, createSessionCleanup, getScheduledJob, invitationCleanup, listScheduledJobs, registerDefaultScheduledJobs, registerScheduledJob, runInvitationCleanup, runSessionCleanup, sessionCleanup, } from "./scheduled/index";
|
|
27
26
|
export { JobOptionsSchema, JobPayloadSchema } from "./types";
|
|
@@ -35,11 +35,23 @@ export declare function defineQueueJob<TSchema extends z.ZodTypeAny, TResult>(de
|
|
|
35
35
|
export declare function createJobRouter<TRouter extends QueuebaseJobRouter>(router: TRouter): TRouter;
|
|
36
36
|
export declare function createQueuebaseWebhookHandler<TRouter extends QueuebaseJobRouter>(router: TRouter, options?: QueuebaseWebhookOptions): (request: Request) => Promise<Response>;
|
|
37
37
|
export declare function listQueuebaseSchedules<TRouter extends QueuebaseJobRouter>(router: TRouter): QueuebaseScheduleMetadata[];
|
|
38
|
+
/**
|
|
39
|
+
* Built-in Queuebase job router. Schedule metadata is always available;
|
|
40
|
+
* handlers require host DI via `createDefaultQueuebaseJobs({ getSystemDb })`.
|
|
41
|
+
* The default handlers throw if invoked without wiring.
|
|
42
|
+
*/
|
|
38
43
|
export declare const queuebaseJobs: {
|
|
39
44
|
invitationCleanup: QueuebaseJobDefinition<z.ZodObject<{}, z.core.$strip>, import("./scheduled").ScheduledJobResult>;
|
|
40
45
|
sessionCleanup: QueuebaseJobDefinition<z.ZodObject<{}, z.core.$strip>, import("./scheduled").ScheduledJobResult>;
|
|
41
46
|
};
|
|
42
47
|
export type QueuebaseJobs = typeof queuebaseJobs;
|
|
48
|
+
/**
|
|
49
|
+
* Build the built-in Queuebase jobs with a host-owned DB accessor.
|
|
50
|
+
* Prefer this over `queuebaseJobs` when handlers actually run.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createDefaultQueuebaseJobs(options: {
|
|
53
|
+
getSystemDb: () => unknown;
|
|
54
|
+
}): QueuebaseJobs;
|
|
43
55
|
export declare const queuebaseWebhookHandler: (request: Request) => Promise<Response>;
|
|
44
56
|
export declare function verifyQueuebaseSignature(body: string, signature: string | null | undefined, secret: string): boolean;
|
|
45
57
|
//# sourceMappingURL=queuebase-webhook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queuebase-webhook.d.ts","sourceRoot":"","sources":["../src/queuebase-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"queuebase-webhook.d.ts","sourceRoot":"","sources":["../src/queuebase-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,uBAAuB,CAAC;AAEjE,MAAM,WAAW,mBAAmB,CAAC,MAAM;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB,CACrC,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EAC3C,OAAO,GAAG,OAAO;IAEjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAqBD,wBAAgB,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO,EAClE,UAAU,EAAE,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,GACnD,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAE1C;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAS,kBAAkB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAE5F;AAED,wBAAgB,6BAA6B,CAAC,OAAO,SAAS,kBAAkB,EAC9E,MAAM,EAAE,OAAO,EACf,OAAO,GAAE,uBAA4B,GACpC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAkEzC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,SAAS,kBAAkB,EACvE,MAAM,EAAE,OAAO,GACd,yBAAyB,EAAE,CAQ7B;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;CAWxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,OAAO,CAAA;CAAE,GAAG,aAAa,CAiBjG;AAED,eAAO,MAAM,uBAAuB,YA3HvB,OAAO,KAAK,OAAO,CAAC,QAAQ,CA+HvC,CAAC;AAEH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GACb,OAAO,CAUT"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { invitationCleanup, sessionCleanup } from "./scheduled";
|
|
3
|
+
import { createInvitationCleanup, createSessionCleanup, invitationCleanup, sessionCleanup, } from "./scheduled";
|
|
4
4
|
class QueuebaseFailure extends Error {
|
|
5
5
|
reason;
|
|
6
6
|
constructor(reason) {
|
|
@@ -77,6 +77,11 @@ export function listQueuebaseSchedules(router) {
|
|
|
77
77
|
})
|
|
78
78
|
.map(([name, definition]) => ({ name, schedule: definition.schedule }));
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Built-in Queuebase job router. Schedule metadata is always available;
|
|
82
|
+
* handlers require host DI via `createDefaultQueuebaseJobs({ getSystemDb })`.
|
|
83
|
+
* The default handlers throw if invoked without wiring.
|
|
84
|
+
*/
|
|
80
85
|
export const queuebaseJobs = createJobRouter({
|
|
81
86
|
invitationCleanup: defineQueueJob({
|
|
82
87
|
input: z.object({}),
|
|
@@ -89,6 +94,26 @@ export const queuebaseJobs = createJobRouter({
|
|
|
89
94
|
handler: async () => sessionCleanup.handler(),
|
|
90
95
|
}),
|
|
91
96
|
});
|
|
97
|
+
/**
|
|
98
|
+
* Build the built-in Queuebase jobs with a host-owned DB accessor.
|
|
99
|
+
* Prefer this over `queuebaseJobs` when handlers actually run.
|
|
100
|
+
*/
|
|
101
|
+
export function createDefaultQueuebaseJobs(options) {
|
|
102
|
+
const invitation = createInvitationCleanup(() => options.getSystemDb());
|
|
103
|
+
const session = createSessionCleanup(() => options.getSystemDb());
|
|
104
|
+
return createJobRouter({
|
|
105
|
+
invitationCleanup: defineQueueJob({
|
|
106
|
+
input: z.object({}),
|
|
107
|
+
schedule: { cron: invitation.cron, timezone: "UTC", overlap: "skip" },
|
|
108
|
+
handler: async () => invitation.handler(),
|
|
109
|
+
}),
|
|
110
|
+
sessionCleanup: defineQueueJob({
|
|
111
|
+
input: z.object({}),
|
|
112
|
+
schedule: { cron: session.cron, timezone: "UTC", overlap: "skip" },
|
|
113
|
+
handler: async () => session.handler(),
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
92
117
|
export const queuebaseWebhookHandler = createQueuebaseWebhookHandler(queuebaseJobs, {
|
|
93
118
|
...(process.env.QUEUEBASE_WEBHOOK_SECRET
|
|
94
119
|
? { webhookSecret: process.env.QUEUEBASE_WEBHOOK_SECRET }
|
package/dist/queuebase.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { z } from "zod";
|
|
|
2
2
|
import type { QueuebaseJobRouter } from "./queuebase-webhook";
|
|
3
3
|
import type { JobOptions, JobResult, QueueProvider } from "./types";
|
|
4
4
|
export type { QueuebaseBackoff, QueuebaseJobContext, QueuebaseJobDefinition, QueuebaseJobRouter, QueuebaseJobs, QueuebaseSchedule, QueuebaseScheduleConfig, QueuebaseScheduleMetadata, QueuebaseWebhookOptions, } from "./queuebase-webhook";
|
|
5
|
-
export { createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, listQueuebaseSchedules, queuebaseJobs, queuebaseWebhookHandler, verifyQueuebaseSignature, } from "./queuebase-webhook";
|
|
5
|
+
export { createDefaultQueuebaseJobs, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, listQueuebaseSchedules, queuebaseJobs, queuebaseWebhookHandler, verifyQueuebaseSignature, } from "./queuebase-webhook";
|
|
6
6
|
export interface QueuebaseClientOptions {
|
|
7
7
|
callbackUrl: string;
|
|
8
8
|
apiUrl?: string;
|
package/dist/queuebase.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queuebase.d.ts","sourceRoot":"","sources":["../src/queuebase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpE,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,kBAAkB,IAAI;KAC/D,CAAC,IAAI,MAAM,OAAO,GAAG;QACpB,OAAO,EAAE,CACP,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EACnC,OAAO,CAAC,EAAE,UAAU,KACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;KACtC;CACF,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAS,kBAAkB,EAChE,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CAAC,OAAO,CAAC,CAoC1B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAsB,GAAG,MAAM,CAE7E;AAED,eAAO,MAAM,kBAAkB;;;EAI7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"queuebase.d.ts","sourceRoot":"","sources":["../src/queuebase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpE,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,6BAA6B,EAC7B,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,kBAAkB,IAAI;KAC/D,CAAC,IAAI,MAAM,OAAO,GAAG;QACpB,OAAO,EAAE,CACP,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EACnC,OAAO,CAAC,EAAE,UAAU,KACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;KACtC;CACF,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAS,kBAAkB,EAChE,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CAAC,OAAO,CAAC,CAoC1B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAsB,GAAG,MAAM,CAE7E;AAED,eAAO,MAAM,kBAAkB;;;EAI7B,CAAC"}
|
package/dist/queuebase.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { queuebaseJobs } from "./queuebase-webhook";
|
|
2
|
-
export { createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, listQueuebaseSchedules, queuebaseJobs, queuebaseWebhookHandler, verifyQueuebaseSignature, } from "./queuebase-webhook";
|
|
2
|
+
export { createDefaultQueuebaseJobs, createJobRouter, createQueuebaseWebhookHandler, defineQueueJob, listQueuebaseSchedules, queuebaseJobs, queuebaseWebhookHandler, verifyQueuebaseSignature, } from "./queuebase-webhook";
|
|
3
3
|
export function createJobClient(router, options) {
|
|
4
4
|
return Object.fromEntries(Object.entries(router).map(([jobName, definition]) => [
|
|
5
5
|
jobName,
|
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
export type { RunInvitationCleanupOptions } from "./jobs/invitation-cleanup";
|
|
2
|
-
export { invitationCleanup, runInvitationCleanup } from "./jobs/invitation-cleanup";
|
|
3
|
-
export type { RunSessionCleanupOptions } from "./jobs/session-cleanup";
|
|
4
|
-
export { runSessionCleanup, sessionCleanup } from "./jobs/session-cleanup";
|
|
1
|
+
export type { GetInvitationCleanupClient, InvitationCleanupClient, RunInvitationCleanupOptions, } from "./jobs/invitation-cleanup";
|
|
2
|
+
export { createInvitationCleanup, invitationCleanup, runInvitationCleanup, } from "./jobs/invitation-cleanup";
|
|
3
|
+
export type { GetSessionCleanupClient, RunSessionCleanupOptions, SessionCleanupClient, } from "./jobs/session-cleanup";
|
|
4
|
+
export { createSessionCleanup, runSessionCleanup, sessionCleanup, } from "./jobs/session-cleanup";
|
|
5
5
|
export type { ScheduledJob, ScheduledJobResult } from "./scheduler";
|
|
6
6
|
export { clearScheduledJobs, getScheduledJob, listScheduledJobs, registerScheduledJob, } from "./scheduler";
|
|
7
|
+
export interface RegisterDefaultScheduledJobsOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Host-owned system DB accessor (e.g. `getSystemDb` from the app data layer).
|
|
10
|
+
* Structural Prisma client is fine — only invitation + session surfaces are used.
|
|
11
|
+
*/
|
|
12
|
+
getSystemDb: () => unknown;
|
|
13
|
+
}
|
|
7
14
|
/**
|
|
8
|
-
* Register the two built-in production scheduled jobs:
|
|
15
|
+
* Register the two built-in production scheduled jobs with an injected DB:
|
|
9
16
|
* - `invitation-cleanup` (every 6h)
|
|
10
17
|
* - `session-cleanup` (daily 00:00 UTC)
|
|
11
18
|
*
|
|
12
19
|
* Idempotent — re-registering overwrites the previous entry.
|
|
20
|
+
* Does **not** import `@nebutra/db`; the host supplies the client.
|
|
13
21
|
*/
|
|
14
|
-
export declare function registerDefaultScheduledJobs(): void;
|
|
22
|
+
export declare function registerDefaultScheduledJobs(options: RegisterDefaultScheduledJobsOptions): void;
|
|
15
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduled/index.ts"],"names":[],"mappings":"AASA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduled/index.ts"],"names":[],"mappings":"AASA,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,mCAAmC;IAClD;;;OAGG;IACH,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mCAAmC,GAAG,IAAI,CAK/F"}
|
package/dist/scheduled/index.js
CHANGED
|
@@ -4,22 +4,23 @@
|
|
|
4
4
|
// Public re-exports:
|
|
5
5
|
// - The scheduler abstraction: register / get / list / clear scheduled jobs
|
|
6
6
|
// - Built-in production jobs: invitation-cleanup, session-cleanup
|
|
7
|
-
// - `registerDefaultScheduledJobs()` —
|
|
7
|
+
// - `registerDefaultScheduledJobs({ getSystemDb })` — inject host DB client
|
|
8
8
|
// =============================================================================
|
|
9
|
-
export { invitationCleanup, runInvitationCleanup } from "./jobs/invitation-cleanup";
|
|
10
|
-
export { runSessionCleanup, sessionCleanup } from "./jobs/session-cleanup";
|
|
9
|
+
export { createInvitationCleanup, invitationCleanup, runInvitationCleanup, } from "./jobs/invitation-cleanup";
|
|
10
|
+
export { createSessionCleanup, runSessionCleanup, sessionCleanup, } from "./jobs/session-cleanup";
|
|
11
11
|
export { clearScheduledJobs, getScheduledJob, listScheduledJobs, registerScheduledJob, } from "./scheduler";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { createInvitationCleanup } from "./jobs/invitation-cleanup";
|
|
13
|
+
import { createSessionCleanup } from "./jobs/session-cleanup";
|
|
14
14
|
import { registerScheduledJob } from "./scheduler";
|
|
15
15
|
/**
|
|
16
|
-
* Register the two built-in production scheduled jobs:
|
|
16
|
+
* Register the two built-in production scheduled jobs with an injected DB:
|
|
17
17
|
* - `invitation-cleanup` (every 6h)
|
|
18
18
|
* - `session-cleanup` (daily 00:00 UTC)
|
|
19
19
|
*
|
|
20
20
|
* Idempotent — re-registering overwrites the previous entry.
|
|
21
|
+
* Does **not** import `@nebutra/db`; the host supplies the client.
|
|
21
22
|
*/
|
|
22
|
-
export function registerDefaultScheduledJobs() {
|
|
23
|
-
registerScheduledJob(
|
|
24
|
-
registerScheduledJob(
|
|
23
|
+
export function registerDefaultScheduledJobs(options) {
|
|
24
|
+
registerScheduledJob(createInvitationCleanup(() => options.getSystemDb()));
|
|
25
|
+
registerScheduledJob(createSessionCleanup(() => options.getSystemDb()));
|
|
25
26
|
}
|
|
@@ -3,7 +3,7 @@ import type { ScheduledJob, ScheduledJobResult } from "../scheduler";
|
|
|
3
3
|
* Minimal subset of the Prisma client surface this job needs.
|
|
4
4
|
* Keeps the test fakes tiny and avoids pulling Prisma's full type into hot paths.
|
|
5
5
|
*/
|
|
6
|
-
interface InvitationCleanupClient {
|
|
6
|
+
export interface InvitationCleanupClient {
|
|
7
7
|
organizationInvitation: {
|
|
8
8
|
updateMany(args: {
|
|
9
9
|
where: {
|
|
@@ -31,10 +31,15 @@ export interface RunInvitationCleanupOptions {
|
|
|
31
31
|
* to `status = 'expired'`. Returns the count of affected rows.
|
|
32
32
|
*/
|
|
33
33
|
export declare function runInvitationCleanup(options: RunInvitationCleanupOptions): Promise<ScheduledJobResult>;
|
|
34
|
+
export type GetInvitationCleanupClient = () => InvitationCleanupClient | Promise<InvitationCleanupClient>;
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
36
|
+
* Build a registry-shaped job with an injected client getter.
|
|
37
|
+
* Apps typically pass `() => getSystemDb()` from their own data layer.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createInvitationCleanup(getClient: GetInvitationCleanupClient): ScheduledJob;
|
|
40
|
+
/**
|
|
41
|
+
* Metadata-only placeholder. Calling `handler` without DI throws —
|
|
42
|
+
* use `createInvitationCleanup(getClient)` or `registerDefaultScheduledJobs`.
|
|
37
43
|
*/
|
|
38
44
|
export declare const invitationCleanup: ScheduledJob;
|
|
39
|
-
export {};
|
|
40
45
|
//# sourceMappingURL=invitation-cleanup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invitation-cleanup.d.ts","sourceRoot":"","sources":["../../../src/scheduled/jobs/invitation-cleanup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invitation-cleanup.d.ts","sourceRoot":"","sources":["../../../src/scheduled/jobs/invitation-cleanup.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAErE;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,sBAAsB,EAAE;QACtB,UAAU,CAAC,IAAI,EAAE;YACf,KAAK,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE;oBAAE,EAAE,EAAE,IAAI,CAAA;iBAAE,CAAA;aAAE,CAAC;YACnD,IAAI,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;SAC1B,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,2BAA2B;IAC1C,qDAAqD;IACrD,MAAM,EAAE,uBAAuB,CAAC;IAChC,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED,MAAM,MAAM,0BAA0B,GAAG,MACrC,uBAAuB,GACvB,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAErC;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,0BAA0B,GAAG,YAAY,CAS3F;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAQ/B,CAAC"}
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
// The job is implemented as two layers:
|
|
8
8
|
// - `runInvitationCleanup({ client })` is the pure async unit, easily
|
|
9
9
|
// testable with an injected fake Prisma client.
|
|
10
|
-
// - `
|
|
11
|
-
//
|
|
10
|
+
// - `createInvitationCleanup(getClient)` builds the registry-shaped
|
|
11
|
+
// `ScheduledJob`. Callers (apps / backends) inject their DB client —
|
|
12
|
+
// this package never imports the private `@nebutra/db` surface.
|
|
12
13
|
// =============================================================================
|
|
13
14
|
import { logger } from "@nebutra/logger";
|
|
14
15
|
/**
|
|
@@ -31,14 +32,27 @@ export async function runInvitationCleanup(options) {
|
|
|
31
32
|
return { ok: true, details: { expired: count } };
|
|
32
33
|
}
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
35
|
+
* Build a registry-shaped job with an injected client getter.
|
|
36
|
+
* Apps typically pass `() => getSystemDb()` from their own data layer.
|
|
37
|
+
*/
|
|
38
|
+
export function createInvitationCleanup(getClient) {
|
|
39
|
+
return {
|
|
40
|
+
name: "invitation-cleanup",
|
|
41
|
+
cron: "0 */6 * * *",
|
|
42
|
+
handler: async () => {
|
|
43
|
+
const client = await getClient();
|
|
44
|
+
return runInvitationCleanup({ client });
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Metadata-only placeholder. Calling `handler` without DI throws —
|
|
50
|
+
* use `createInvitationCleanup(getClient)` or `registerDefaultScheduledJobs`.
|
|
36
51
|
*/
|
|
37
52
|
export const invitationCleanup = {
|
|
38
53
|
name: "invitation-cleanup",
|
|
39
54
|
cron: "0 */6 * * *",
|
|
40
55
|
handler: async () => {
|
|
41
|
-
|
|
42
|
-
return runInvitationCleanup({ client: getSystemDb() });
|
|
56
|
+
throw new Error("@nebutra/queue invitationCleanup requires a DB client. Use createInvitationCleanup(getClient) or registerDefaultScheduledJobs({ getSystemDb }).");
|
|
43
57
|
},
|
|
44
58
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ScheduledJob, ScheduledJobResult } from "../scheduler";
|
|
2
|
-
interface SessionCleanupClient {
|
|
2
|
+
export interface SessionCleanupClient {
|
|
3
3
|
authSession: {
|
|
4
4
|
deleteMany(args: {
|
|
5
5
|
where: {
|
|
@@ -19,6 +19,15 @@ export interface RunSessionCleanupOptions {
|
|
|
19
19
|
now?: () => Date;
|
|
20
20
|
}
|
|
21
21
|
export declare function runSessionCleanup(options: RunSessionCleanupOptions): Promise<ScheduledJobResult>;
|
|
22
|
+
export type GetSessionCleanupClient = () => SessionCleanupClient | Promise<SessionCleanupClient>;
|
|
23
|
+
/**
|
|
24
|
+
* Build a registry-shaped job with an injected client getter.
|
|
25
|
+
* Apps typically pass `() => getSystemDb()` from their own data layer.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSessionCleanup(getClient: GetSessionCleanupClient): ScheduledJob;
|
|
28
|
+
/**
|
|
29
|
+
* Metadata-only placeholder. Calling `handler` without DI throws —
|
|
30
|
+
* use `createSessionCleanup(getClient)` or `registerDefaultScheduledJobs`.
|
|
31
|
+
*/
|
|
22
32
|
export declare const sessionCleanup: ScheduledJob;
|
|
23
|
-
export {};
|
|
24
33
|
//# sourceMappingURL=session-cleanup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cleanup.d.ts","sourceRoot":"","sources":["../../../src/scheduled/jobs/session-cleanup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-cleanup.d.ts","sourceRoot":"","sources":["../../../src/scheduled/jobs/session-cleanup.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,UAAU,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE;gBAAE,SAAS,EAAE;oBAAE,EAAE,EAAE,IAAI,CAAA;iBAAE,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtF,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,qDAAqD;IACrD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEjG;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,uBAAuB,GAAG,YAAY,CASrF;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,YAQ5B,CAAC"}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Two layers (mirrors invitation-cleanup):
|
|
8
8
|
// - `runSessionCleanup({ client })` — pure async unit, DI-friendly.
|
|
9
|
-
// - `
|
|
9
|
+
// - `createSessionCleanup(getClient)` — registry-shaped `ScheduledJob`.
|
|
10
|
+
// This package never imports the private `@nebutra/db` surface.
|
|
10
11
|
// =============================================================================
|
|
11
12
|
import { logger } from "@nebutra/logger";
|
|
12
13
|
export async function runSessionCleanup(options) {
|
|
@@ -22,11 +23,28 @@ export async function runSessionCleanup(options) {
|
|
|
22
23
|
});
|
|
23
24
|
return { ok: true, details: { deleted: count } };
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Build a registry-shaped job with an injected client getter.
|
|
28
|
+
* Apps typically pass `() => getSystemDb()` from their own data layer.
|
|
29
|
+
*/
|
|
30
|
+
export function createSessionCleanup(getClient) {
|
|
31
|
+
return {
|
|
32
|
+
name: "session-cleanup",
|
|
33
|
+
cron: "0 0 * * *",
|
|
34
|
+
handler: async () => {
|
|
35
|
+
const client = await getClient();
|
|
36
|
+
return runSessionCleanup({ client });
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Metadata-only placeholder. Calling `handler` without DI throws —
|
|
42
|
+
* use `createSessionCleanup(getClient)` or `registerDefaultScheduledJobs`.
|
|
43
|
+
*/
|
|
25
44
|
export const sessionCleanup = {
|
|
26
45
|
name: "session-cleanup",
|
|
27
46
|
cron: "0 0 * * *",
|
|
28
47
|
handler: async () => {
|
|
29
|
-
|
|
30
|
-
return runSessionCleanup({ client: getSystemDb() });
|
|
48
|
+
throw new Error("@nebutra/queue sessionCleanup requires a DB client. Use createSessionCleanup(getClient) or registerDefaultScheduledJobs({ getSystemDb }).");
|
|
31
49
|
},
|
|
32
50
|
};
|
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nebutra/queue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"nebutra": {
|
|
8
|
+
"graph": "core",
|
|
8
9
|
"status": "foundation",
|
|
9
10
|
"productionReady": false,
|
|
10
11
|
"requires": [
|
|
11
12
|
"QSTASH_TOKEN (+ signing keys) for serverless",
|
|
12
13
|
"Configured QStash dlqFetcher/dlqEndpoint for provider-side DLQ observability",
|
|
13
14
|
"REDIS_URL for BullMQ self-hosted",
|
|
14
|
-
"AWS_SQS_QUEUE_URL (+ AWS credentials) for SQS"
|
|
15
|
+
"AWS_SQS_QUEUE_URL (+ AWS credentials) for SQS",
|
|
16
|
+
"Host-injected getSystemDb for registerDefaultScheduledJobs (optional scheduled jobs)"
|
|
15
17
|
],
|
|
16
18
|
"gaps": [
|
|
17
19
|
"Worker auto-scaling TODO"
|
|
@@ -59,20 +61,12 @@
|
|
|
59
61
|
"bullmq": "^5.34.8",
|
|
60
62
|
"ioredis": "^5.4.2",
|
|
61
63
|
"zod": "^4.3.6",
|
|
62
|
-
"@nebutra/
|
|
63
|
-
"@nebutra/
|
|
64
|
-
},
|
|
65
|
-
"peerDependencies": {
|
|
66
|
-
"@nebutra/db": "0.1.2"
|
|
67
|
-
},
|
|
68
|
-
"peerDependenciesMeta": {
|
|
69
|
-
"@nebutra/db": {
|
|
70
|
-
"optional": true
|
|
71
|
-
}
|
|
64
|
+
"@nebutra/logger": "2.0.0",
|
|
65
|
+
"@nebutra/provider-factory": "2.0.0"
|
|
72
66
|
},
|
|
73
67
|
"devDependencies": {
|
|
74
68
|
"typescript": "^5.9.3",
|
|
75
|
-
"
|
|
69
|
+
"vitest": "^4.1.4"
|
|
76
70
|
},
|
|
77
71
|
"homepage": "https://github.com/Nebutra/Nebutra-Sailor/tree/main/packages/integrations/queue#readme",
|
|
78
72
|
"repository": {
|