@contractspec/lib.jobs 1.57.0 → 1.59.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/contracts/index.d.ts +494 -500
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +298 -461
- package/dist/entities/index.d.ts +117 -122
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/index.js +170 -193
- package/dist/events.d.ts +297 -303
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +199 -351
- package/dist/handlers/gmail-sync-handler.d.ts +5 -9
- package/dist/handlers/gmail-sync-handler.d.ts.map +1 -1
- package/dist/handlers/gmail-sync-handler.js +8 -8
- package/dist/handlers/index.d.ts +5 -9
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +53 -10
- package/dist/handlers/ping-job.d.ts +6 -10
- package/dist/handlers/ping-job.d.ts.map +1 -1
- package/dist/handlers/ping-job.js +13 -12
- package/dist/handlers/storage-document-handler.d.ts +7 -11
- package/dist/handlers/storage-document-handler.d.ts.map +1 -1
- package/dist/handlers/storage-document-handler.js +15 -13
- package/dist/index.d.ts +7 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1366 -64
- package/dist/jobs.capability.d.ts +2 -7
- package/dist/jobs.capability.d.ts.map +1 -1
- package/dist/jobs.capability.js +29 -33
- package/dist/jobs.feature.d.ts +1 -6
- package/dist/jobs.feature.d.ts.map +1 -1
- package/dist/jobs.feature.js +45 -108
- package/dist/node/contracts/index.js +318 -0
- package/dist/node/entities/index.js +174 -0
- package/dist/node/events.js +200 -0
- package/dist/node/handlers/gmail-sync-handler.js +9 -0
- package/dist/node/handlers/index.js +55 -0
- package/dist/node/handlers/ping-job.js +14 -0
- package/dist/node/handlers/storage-document-handler.js +16 -0
- package/dist/node/index.js +1368 -0
- package/dist/node/jobs.capability.js +28 -0
- package/dist/node/jobs.feature.js +46 -0
- package/dist/node/queue/gcp-cloud-tasks.js +66 -0
- package/dist/node/queue/gcp-pubsub.js +54 -0
- package/dist/node/queue/index.js +478 -0
- package/dist/node/queue/memory-queue.js +160 -0
- package/dist/node/queue/register-defined-job.js +15 -0
- package/dist/node/queue/scaleway-sqs-queue.js +206 -0
- package/dist/node/queue/types.js +10 -0
- package/dist/node/scheduler/index.js +117 -0
- package/dist/queue/gcp-cloud-tasks.d.ts +33 -36
- package/dist/queue/gcp-cloud-tasks.d.ts.map +1 -1
- package/dist/queue/gcp-cloud-tasks.js +65 -59
- package/dist/queue/gcp-pubsub.d.ts +18 -21
- package/dist/queue/gcp-pubsub.d.ts.map +1 -1
- package/dist/queue/gcp-pubsub.js +53 -45
- package/dist/queue/index.d.ts +6 -15
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +476 -20
- package/dist/queue/memory-queue.d.ts +25 -29
- package/dist/queue/memory-queue.d.ts.map +1 -1
- package/dist/queue/memory-queue.js +159 -138
- package/dist/queue/register-defined-job.d.ts +3 -7
- package/dist/queue/register-defined-job.d.ts.map +1 -1
- package/dist/queue/register-defined-job.js +14 -14
- package/dist/queue/scaleway-sqs-queue.d.ts +31 -35
- package/dist/queue/scaleway-sqs-queue.d.ts.map +1 -1
- package/dist/queue/scaleway-sqs-queue.js +205 -173
- package/dist/queue/types.d.ts +2 -8
- package/dist/queue/types.d.ts.map +1 -1
- package/dist/queue/types.js +11 -12
- package/dist/scheduler/index.d.ts +68 -72
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +113 -141
- package/package.json +176 -50
- package/dist/_virtual/_rolldown/runtime.js +0 -36
- package/dist/contracts/index.js.map +0 -1
- package/dist/entities/index.js.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/handlers/gmail-sync-handler.js.map +0 -1
- package/dist/handlers/index.js.map +0 -1
- package/dist/handlers/ping-job.js.map +0 -1
- package/dist/handlers/storage-document-handler.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jobs.capability.js.map +0 -1
- package/dist/jobs.feature.js.map +0 -1
- package/dist/queue/gcp-cloud-tasks.js.map +0 -1
- package/dist/queue/gcp-pubsub.js.map +0 -1
- package/dist/queue/index.js.map +0 -1
- package/dist/queue/memory-queue.js.map +0 -1
- package/dist/queue/register-defined-job.js.map +0 -1
- package/dist/queue/scaleway-sqs-queue.js.map +0 -1
- package/dist/queue/types.js.map +0 -1
- package/dist/scheduler/index.js.map +0 -1
package/dist/scheduler/index.js
CHANGED
|
@@ -1,146 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/scheduler/index.ts
|
|
3
|
+
function getNextCronRun(cronExpression, after = new Date) {
|
|
4
|
+
try {
|
|
5
|
+
const parts = cronExpression.trim().split(/\s+/);
|
|
6
|
+
if (parts.length !== 5) {
|
|
7
|
+
console.warn(`Invalid cron expression: ${cronExpression}`);
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const minute = parts[0];
|
|
11
|
+
const hour = parts[1];
|
|
12
|
+
const dayOfMonth = parts[2];
|
|
13
|
+
const month = parts[3];
|
|
14
|
+
const next = new Date(after);
|
|
15
|
+
next.setSeconds(0);
|
|
16
|
+
next.setMilliseconds(0);
|
|
17
|
+
if (minute && hour && minute !== "*" && hour !== "*" && dayOfMonth === "*" && month === "*") {
|
|
18
|
+
const targetMinute = Number.parseInt(minute, 10);
|
|
19
|
+
const targetHour = Number.parseInt(hour, 10);
|
|
20
|
+
next.setHours(targetHour, targetMinute, 0, 0);
|
|
21
|
+
if (next <= after) {
|
|
22
|
+
next.setDate(next.getDate() + 1);
|
|
23
|
+
}
|
|
24
|
+
return next;
|
|
25
|
+
}
|
|
26
|
+
next.setMinutes(next.getMinutes() + 1);
|
|
27
|
+
return next;
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class JobScheduler {
|
|
34
|
+
queue;
|
|
35
|
+
schedules = new Map;
|
|
36
|
+
timer;
|
|
37
|
+
checkIntervalMs;
|
|
38
|
+
constructor(queue, options = {}) {
|
|
39
|
+
this.queue = queue;
|
|
40
|
+
this.checkIntervalMs = options.checkIntervalMs ?? 60000;
|
|
41
|
+
}
|
|
42
|
+
schedule(config) {
|
|
43
|
+
const nextRun = config.enabled !== false ? getNextCronRun(config.cronExpression) : null;
|
|
44
|
+
this.schedules.set(config.name, {
|
|
45
|
+
...config,
|
|
46
|
+
enabled: config.enabled ?? true,
|
|
47
|
+
nextRun,
|
|
48
|
+
lastRun: null
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
unschedule(name) {
|
|
52
|
+
return this.schedules.delete(name);
|
|
53
|
+
}
|
|
54
|
+
enable(name) {
|
|
55
|
+
const schedule = this.schedules.get(name);
|
|
56
|
+
if (!schedule)
|
|
57
|
+
return false;
|
|
58
|
+
schedule.enabled = true;
|
|
59
|
+
schedule.nextRun = getNextCronRun(schedule.cronExpression);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
disable(name) {
|
|
63
|
+
const schedule = this.schedules.get(name);
|
|
64
|
+
if (!schedule)
|
|
65
|
+
return false;
|
|
66
|
+
schedule.enabled = false;
|
|
67
|
+
schedule.nextRun = null;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
getSchedules() {
|
|
71
|
+
return Array.from(this.schedules.values());
|
|
72
|
+
}
|
|
73
|
+
getSchedule(name) {
|
|
74
|
+
return this.schedules.get(name);
|
|
75
|
+
}
|
|
76
|
+
start() {
|
|
77
|
+
if (this.timer)
|
|
78
|
+
return;
|
|
79
|
+
this.checkSchedules();
|
|
80
|
+
this.timer = setInterval(() => {
|
|
81
|
+
this.checkSchedules();
|
|
82
|
+
}, this.checkIntervalMs);
|
|
83
|
+
}
|
|
84
|
+
stop() {
|
|
85
|
+
if (this.timer) {
|
|
86
|
+
clearInterval(this.timer);
|
|
87
|
+
this.timer = undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async checkSchedules() {
|
|
91
|
+
const now = new Date;
|
|
92
|
+
for (const schedule of this.schedules.values()) {
|
|
93
|
+
if (!schedule.enabled || !schedule.nextRun)
|
|
94
|
+
continue;
|
|
95
|
+
if (schedule.nextRun <= now) {
|
|
96
|
+
try {
|
|
97
|
+
const payload = typeof schedule.payload === "function" ? await schedule.payload() : schedule.payload;
|
|
98
|
+
await this.queue.enqueue(schedule.jobType, payload, schedule.options);
|
|
99
|
+
schedule.lastRun = now;
|
|
100
|
+
schedule.nextRun = getNextCronRun(schedule.cronExpression, now);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error(`Failed to enqueue scheduled job ${schedule.name}:`, error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
32
107
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Job scheduler for recurring jobs.
|
|
35
|
-
*/
|
|
36
|
-
var JobScheduler = class {
|
|
37
|
-
schedules = /* @__PURE__ */ new Map();
|
|
38
|
-
timer;
|
|
39
|
-
checkIntervalMs;
|
|
40
|
-
constructor(queue, options = {}) {
|
|
41
|
-
this.queue = queue;
|
|
42
|
-
this.checkIntervalMs = options.checkIntervalMs ?? 6e4;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Add a scheduled job.
|
|
46
|
-
*/
|
|
47
|
-
schedule(config) {
|
|
48
|
-
const nextRun = config.enabled !== false ? getNextCronRun(config.cronExpression) : null;
|
|
49
|
-
this.schedules.set(config.name, {
|
|
50
|
-
...config,
|
|
51
|
-
enabled: config.enabled ?? true,
|
|
52
|
-
nextRun,
|
|
53
|
-
lastRun: null
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Remove a scheduled job.
|
|
58
|
-
*/
|
|
59
|
-
unschedule(name) {
|
|
60
|
-
return this.schedules.delete(name);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Enable a scheduled job.
|
|
64
|
-
*/
|
|
65
|
-
enable(name) {
|
|
66
|
-
const schedule = this.schedules.get(name);
|
|
67
|
-
if (!schedule) return false;
|
|
68
|
-
schedule.enabled = true;
|
|
69
|
-
schedule.nextRun = getNextCronRun(schedule.cronExpression);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Disable a scheduled job.
|
|
74
|
-
*/
|
|
75
|
-
disable(name) {
|
|
76
|
-
const schedule = this.schedules.get(name);
|
|
77
|
-
if (!schedule) return false;
|
|
78
|
-
schedule.enabled = false;
|
|
79
|
-
schedule.nextRun = null;
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Get all schedules.
|
|
84
|
-
*/
|
|
85
|
-
getSchedules() {
|
|
86
|
-
return Array.from(this.schedules.values());
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Get a specific schedule.
|
|
90
|
-
*/
|
|
91
|
-
getSchedule(name) {
|
|
92
|
-
return this.schedules.get(name);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Start the scheduler.
|
|
96
|
-
*/
|
|
97
|
-
start() {
|
|
98
|
-
if (this.timer) return;
|
|
99
|
-
this.checkSchedules();
|
|
100
|
-
this.timer = setInterval(() => {
|
|
101
|
-
this.checkSchedules();
|
|
102
|
-
}, this.checkIntervalMs);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Stop the scheduler.
|
|
106
|
-
*/
|
|
107
|
-
stop() {
|
|
108
|
-
if (this.timer) {
|
|
109
|
-
clearInterval(this.timer);
|
|
110
|
-
this.timer = void 0;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Check and enqueue due schedules.
|
|
115
|
-
*/
|
|
116
|
-
async checkSchedules() {
|
|
117
|
-
const now = /* @__PURE__ */ new Date();
|
|
118
|
-
for (const schedule of this.schedules.values()) {
|
|
119
|
-
if (!schedule.enabled || !schedule.nextRun) continue;
|
|
120
|
-
if (schedule.nextRun <= now) try {
|
|
121
|
-
const payload = typeof schedule.payload === "function" ? await schedule.payload() : schedule.payload;
|
|
122
|
-
await this.queue.enqueue(schedule.jobType, payload, schedule.options);
|
|
123
|
-
schedule.lastRun = now;
|
|
124
|
-
schedule.nextRun = getNextCronRun(schedule.cronExpression, now);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
console.error(`Failed to enqueue scheduled job ${schedule.name}:`, error);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
/**
|
|
132
|
-
* Create a job scheduler instance.
|
|
133
|
-
*/
|
|
134
108
|
function createScheduler(queue, options) {
|
|
135
|
-
|
|
109
|
+
return new JobScheduler(queue, options);
|
|
136
110
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Helper to define a scheduled job configuration.
|
|
139
|
-
*/
|
|
140
111
|
function defineSchedule(config) {
|
|
141
|
-
|
|
112
|
+
return config;
|
|
142
113
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
114
|
+
export {
|
|
115
|
+
defineSchedule,
|
|
116
|
+
createScheduler,
|
|
117
|
+
JobScheduler
|
|
118
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/lib.jobs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.59.0",
|
|
4
4
|
"description": "Background jobs and scheduler module for ContractSpec applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -15,49 +15,55 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
17
17
|
"publish:pkg:canary": "bun publish:pkg --tag canary",
|
|
18
|
-
"build": "bun build:
|
|
19
|
-
"build:bundle": "
|
|
20
|
-
"build:types": "
|
|
21
|
-
"dev": "bun
|
|
18
|
+
"build": "bun run prebuild && bun run build:bundle && bun run build:types",
|
|
19
|
+
"build:bundle": "contractspec-bun-build transpile",
|
|
20
|
+
"build:types": "contractspec-bun-build types",
|
|
21
|
+
"dev": "contractspec-bun-build dev",
|
|
22
22
|
"clean": "rimraf dist .turbo",
|
|
23
23
|
"lint": "bun lint:fix",
|
|
24
24
|
"lint:fix": "eslint src --fix",
|
|
25
|
-
"lint:check": "eslint src"
|
|
25
|
+
"lint:check": "eslint src",
|
|
26
|
+
"prebuild": "contractspec-bun-build prebuild",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
26
28
|
},
|
|
27
29
|
"dependencies": {
|
|
28
|
-
"@contractspec/lib.schema": "1.
|
|
29
|
-
"@contractspec/lib.contracts": "1.
|
|
30
|
-
"@contractspec/lib.logger": "1.
|
|
31
|
-
"@contractspec/lib.knowledge": "1.
|
|
30
|
+
"@contractspec/lib.schema": "1.59.0",
|
|
31
|
+
"@contractspec/lib.contracts": "1.59.0",
|
|
32
|
+
"@contractspec/lib.logger": "1.59.0",
|
|
33
|
+
"@contractspec/lib.knowledge": "1.59.0",
|
|
32
34
|
"@aws-sdk/client-sqs": "^3.984.0",
|
|
33
35
|
"zod": "^4.3.5",
|
|
34
36
|
"cron-parser": "^5.4.0"
|
|
35
37
|
},
|
|
36
38
|
"devDependencies": {
|
|
37
|
-
"@contractspec/tool.typescript": "1.
|
|
38
|
-
"
|
|
39
|
-
"
|
|
39
|
+
"@contractspec/tool.typescript": "1.59.0",
|
|
40
|
+
"typescript": "^5.9.3",
|
|
41
|
+
"@contractspec/tool.bun": "1.58.0"
|
|
40
42
|
},
|
|
41
43
|
"exports": {
|
|
42
|
-
".": "./
|
|
43
|
-
"./contracts": "./
|
|
44
|
-
"./
|
|
45
|
-
"./
|
|
46
|
-
"./
|
|
47
|
-
"./
|
|
48
|
-
"./handlers
|
|
49
|
-
"./handlers/
|
|
50
|
-
"./
|
|
51
|
-
"./
|
|
52
|
-
"./
|
|
53
|
-
"./
|
|
54
|
-
"./
|
|
55
|
-
"./queue
|
|
56
|
-
"./queue/
|
|
57
|
-
"./queue/
|
|
58
|
-
"./queue/
|
|
59
|
-
"./
|
|
60
|
-
"
|
|
44
|
+
".": "./src/index.ts",
|
|
45
|
+
"./contracts": "./src/contracts/index.ts",
|
|
46
|
+
"./contracts/index": "./src/contracts/index.ts",
|
|
47
|
+
"./entities": "./src/entities/index.ts",
|
|
48
|
+
"./entities/index": "./src/entities/index.ts",
|
|
49
|
+
"./events": "./src/events.ts",
|
|
50
|
+
"./handlers": "./src/handlers/index.ts",
|
|
51
|
+
"./handlers/gmail-sync-handler": "./src/handlers/gmail-sync-handler.ts",
|
|
52
|
+
"./handlers/index": "./src/handlers/index.ts",
|
|
53
|
+
"./handlers/ping-job": "./src/handlers/ping-job.ts",
|
|
54
|
+
"./handlers/storage-document-handler": "./src/handlers/storage-document-handler.ts",
|
|
55
|
+
"./jobs.capability": "./src/jobs.capability.ts",
|
|
56
|
+
"./jobs.feature": "./src/jobs.feature.ts",
|
|
57
|
+
"./queue": "./src/queue/index.ts",
|
|
58
|
+
"./queue/gcp-cloud-tasks": "./src/queue/gcp-cloud-tasks.ts",
|
|
59
|
+
"./queue/gcp-pubsub": "./src/queue/gcp-pubsub.ts",
|
|
60
|
+
"./queue/index": "./src/queue/index.ts",
|
|
61
|
+
"./queue/memory-queue": "./src/queue/memory-queue.ts",
|
|
62
|
+
"./queue/register-defined-job": "./src/queue/register-defined-job.ts",
|
|
63
|
+
"./queue/scaleway-sqs-queue": "./src/queue/scaleway-sqs-queue.ts",
|
|
64
|
+
"./queue/types": "./src/queue/types.ts",
|
|
65
|
+
"./scheduler": "./src/scheduler/index.ts",
|
|
66
|
+
"./scheduler/index": "./src/scheduler/index.ts"
|
|
61
67
|
},
|
|
62
68
|
"files": [
|
|
63
69
|
"dist",
|
|
@@ -66,24 +72,144 @@
|
|
|
66
72
|
"publishConfig": {
|
|
67
73
|
"access": "public",
|
|
68
74
|
"exports": {
|
|
69
|
-
".":
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
"./
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"./
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
75
|
+
".": {
|
|
76
|
+
"types": "./dist/index.d.ts",
|
|
77
|
+
"bun": "./dist/index.js",
|
|
78
|
+
"node": "./dist/node/index.mjs",
|
|
79
|
+
"default": "./dist/index.js"
|
|
80
|
+
},
|
|
81
|
+
"./contracts": {
|
|
82
|
+
"types": "./dist/contracts/index.d.ts",
|
|
83
|
+
"bun": "./dist/contracts/index.js",
|
|
84
|
+
"node": "./dist/node/contracts/index.mjs",
|
|
85
|
+
"default": "./dist/contracts/index.js"
|
|
86
|
+
},
|
|
87
|
+
"./contracts/index": {
|
|
88
|
+
"types": "./dist/contracts/index.d.ts",
|
|
89
|
+
"bun": "./dist/contracts/index.js",
|
|
90
|
+
"node": "./dist/node/contracts/index.mjs",
|
|
91
|
+
"default": "./dist/contracts/index.js"
|
|
92
|
+
},
|
|
93
|
+
"./entities": {
|
|
94
|
+
"types": "./dist/entities/index.d.ts",
|
|
95
|
+
"bun": "./dist/entities/index.js",
|
|
96
|
+
"node": "./dist/node/entities/index.mjs",
|
|
97
|
+
"default": "./dist/entities/index.js"
|
|
98
|
+
},
|
|
99
|
+
"./entities/index": {
|
|
100
|
+
"types": "./dist/entities/index.d.ts",
|
|
101
|
+
"bun": "./dist/entities/index.js",
|
|
102
|
+
"node": "./dist/node/entities/index.mjs",
|
|
103
|
+
"default": "./dist/entities/index.js"
|
|
104
|
+
},
|
|
105
|
+
"./events": {
|
|
106
|
+
"types": "./dist/events.d.ts",
|
|
107
|
+
"bun": "./dist/events.js",
|
|
108
|
+
"node": "./dist/node/events.mjs",
|
|
109
|
+
"default": "./dist/events.js"
|
|
110
|
+
},
|
|
111
|
+
"./handlers": {
|
|
112
|
+
"types": "./dist/handlers/index.d.ts",
|
|
113
|
+
"bun": "./dist/handlers/index.js",
|
|
114
|
+
"node": "./dist/node/handlers/index.mjs",
|
|
115
|
+
"default": "./dist/handlers/index.js"
|
|
116
|
+
},
|
|
117
|
+
"./handlers/gmail-sync-handler": {
|
|
118
|
+
"types": "./dist/handlers/gmail-sync-handler.d.ts",
|
|
119
|
+
"bun": "./dist/handlers/gmail-sync-handler.js",
|
|
120
|
+
"node": "./dist/node/handlers/gmail-sync-handler.mjs",
|
|
121
|
+
"default": "./dist/handlers/gmail-sync-handler.js"
|
|
122
|
+
},
|
|
123
|
+
"./handlers/index": {
|
|
124
|
+
"types": "./dist/handlers/index.d.ts",
|
|
125
|
+
"bun": "./dist/handlers/index.js",
|
|
126
|
+
"node": "./dist/node/handlers/index.mjs",
|
|
127
|
+
"default": "./dist/handlers/index.js"
|
|
128
|
+
},
|
|
129
|
+
"./handlers/ping-job": {
|
|
130
|
+
"types": "./dist/handlers/ping-job.d.ts",
|
|
131
|
+
"bun": "./dist/handlers/ping-job.js",
|
|
132
|
+
"node": "./dist/node/handlers/ping-job.mjs",
|
|
133
|
+
"default": "./dist/handlers/ping-job.js"
|
|
134
|
+
},
|
|
135
|
+
"./handlers/storage-document-handler": {
|
|
136
|
+
"types": "./dist/handlers/storage-document-handler.d.ts",
|
|
137
|
+
"bun": "./dist/handlers/storage-document-handler.js",
|
|
138
|
+
"node": "./dist/node/handlers/storage-document-handler.mjs",
|
|
139
|
+
"default": "./dist/handlers/storage-document-handler.js"
|
|
140
|
+
},
|
|
141
|
+
"./jobs.capability": {
|
|
142
|
+
"types": "./dist/jobs.capability.d.ts",
|
|
143
|
+
"bun": "./dist/jobs.capability.js",
|
|
144
|
+
"node": "./dist/node/jobs.capability.mjs",
|
|
145
|
+
"default": "./dist/jobs.capability.js"
|
|
146
|
+
},
|
|
147
|
+
"./jobs.feature": {
|
|
148
|
+
"types": "./dist/jobs.feature.d.ts",
|
|
149
|
+
"bun": "./dist/jobs.feature.js",
|
|
150
|
+
"node": "./dist/node/jobs.feature.mjs",
|
|
151
|
+
"default": "./dist/jobs.feature.js"
|
|
152
|
+
},
|
|
153
|
+
"./queue": {
|
|
154
|
+
"types": "./dist/queue/index.d.ts",
|
|
155
|
+
"bun": "./dist/queue/index.js",
|
|
156
|
+
"node": "./dist/node/queue/index.mjs",
|
|
157
|
+
"default": "./dist/queue/index.js"
|
|
158
|
+
},
|
|
159
|
+
"./queue/gcp-cloud-tasks": {
|
|
160
|
+
"types": "./dist/queue/gcp-cloud-tasks.d.ts",
|
|
161
|
+
"bun": "./dist/queue/gcp-cloud-tasks.js",
|
|
162
|
+
"node": "./dist/node/queue/gcp-cloud-tasks.mjs",
|
|
163
|
+
"default": "./dist/queue/gcp-cloud-tasks.js"
|
|
164
|
+
},
|
|
165
|
+
"./queue/gcp-pubsub": {
|
|
166
|
+
"types": "./dist/queue/gcp-pubsub.d.ts",
|
|
167
|
+
"bun": "./dist/queue/gcp-pubsub.js",
|
|
168
|
+
"node": "./dist/node/queue/gcp-pubsub.mjs",
|
|
169
|
+
"default": "./dist/queue/gcp-pubsub.js"
|
|
170
|
+
},
|
|
171
|
+
"./queue/index": {
|
|
172
|
+
"types": "./dist/queue/index.d.ts",
|
|
173
|
+
"bun": "./dist/queue/index.js",
|
|
174
|
+
"node": "./dist/node/queue/index.mjs",
|
|
175
|
+
"default": "./dist/queue/index.js"
|
|
176
|
+
},
|
|
177
|
+
"./queue/memory-queue": {
|
|
178
|
+
"types": "./dist/queue/memory-queue.d.ts",
|
|
179
|
+
"bun": "./dist/queue/memory-queue.js",
|
|
180
|
+
"node": "./dist/node/queue/memory-queue.mjs",
|
|
181
|
+
"default": "./dist/queue/memory-queue.js"
|
|
182
|
+
},
|
|
183
|
+
"./queue/register-defined-job": {
|
|
184
|
+
"types": "./dist/queue/register-defined-job.d.ts",
|
|
185
|
+
"bun": "./dist/queue/register-defined-job.js",
|
|
186
|
+
"node": "./dist/node/queue/register-defined-job.mjs",
|
|
187
|
+
"default": "./dist/queue/register-defined-job.js"
|
|
188
|
+
},
|
|
189
|
+
"./queue/scaleway-sqs-queue": {
|
|
190
|
+
"types": "./dist/queue/scaleway-sqs-queue.d.ts",
|
|
191
|
+
"bun": "./dist/queue/scaleway-sqs-queue.js",
|
|
192
|
+
"node": "./dist/node/queue/scaleway-sqs-queue.mjs",
|
|
193
|
+
"default": "./dist/queue/scaleway-sqs-queue.js"
|
|
194
|
+
},
|
|
195
|
+
"./queue/types": {
|
|
196
|
+
"types": "./dist/queue/types.d.ts",
|
|
197
|
+
"bun": "./dist/queue/types.js",
|
|
198
|
+
"node": "./dist/node/queue/types.mjs",
|
|
199
|
+
"default": "./dist/queue/types.js"
|
|
200
|
+
},
|
|
201
|
+
"./scheduler": {
|
|
202
|
+
"types": "./dist/scheduler/index.d.ts",
|
|
203
|
+
"bun": "./dist/scheduler/index.js",
|
|
204
|
+
"node": "./dist/node/scheduler/index.mjs",
|
|
205
|
+
"default": "./dist/scheduler/index.js"
|
|
206
|
+
},
|
|
207
|
+
"./scheduler/index": {
|
|
208
|
+
"types": "./dist/scheduler/index.d.ts",
|
|
209
|
+
"bun": "./dist/scheduler/index.js",
|
|
210
|
+
"node": "./dist/node/scheduler/index.mjs",
|
|
211
|
+
"default": "./dist/scheduler/index.js"
|
|
212
|
+
}
|
|
87
213
|
},
|
|
88
214
|
"registry": "https://registry.npmjs.org/"
|
|
89
215
|
},
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
//#region \0rolldown/runtime.js
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __exportAll = (all, no_symbols) => {
|
|
7
|
-
let target = {};
|
|
8
|
-
for (var name in all) {
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
if (!no_symbols) {
|
|
15
|
-
__defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
16
|
-
}
|
|
17
|
-
return target;
|
|
18
|
-
};
|
|
19
|
-
var __copyProps = (to, from, except, desc) => {
|
|
20
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
|
-
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
22
|
-
key = keys[i];
|
|
23
|
-
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
24
|
-
__defProp(to, key, {
|
|
25
|
-
get: ((k) => from[k]).bind(null, key),
|
|
26
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return to;
|
|
32
|
-
};
|
|
33
|
-
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
34
|
-
|
|
35
|
-
//#endregion
|
|
36
|
-
export { __exportAll, __reExport };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/contracts/index.ts"],"sourcesContent":["import { ScalarTypeEnum, defineSchemaModel } from '@contractspec/lib.schema';\nimport { defineCommand, defineQuery } from '@contractspec/lib.contracts';\n\nconst OWNERS = ['platform.jobs'] as const;\n\n// ============ Schema Models ============\n\nexport const JobModel = defineSchemaModel({\n name: 'Job',\n description: 'Represents a background job',\n fields: {\n id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n type: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n version: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n payload: { type: ScalarTypeEnum.JSON(), isOptional: false },\n status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }, // JobStatus enum value\n priority: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n attempts: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n maxRetries: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n scheduledAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n startedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n lastError: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n },\n});\n\nexport const ScheduledJobModel = defineSchemaModel({\n name: 'ScheduledJob',\n description: 'Represents a scheduled/recurring job',\n fields: {\n id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n cronExpression: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n timezone: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n jobType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n enabled: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n lastRunAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n nextRunAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const QueueStatsModel = defineSchemaModel({\n name: 'QueueStats',\n description: 'Job queue statistics',\n fields: {\n pending: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n running: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n completed: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n failed: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n deadLetter: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n },\n});\n\n// ============ Input/Output Models ============\n\nconst EnqueueJobInput = defineSchemaModel({\n name: 'EnqueueJobInput',\n description: 'Input for enqueuing a new job',\n fields: {\n type: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n payload: { type: ScalarTypeEnum.JSON(), isOptional: false },\n delaySeconds: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n dedupeKey: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n maxRetries: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n priority: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n timeoutMs: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n },\n});\n\nconst GetJobInput = defineSchemaModel({\n name: 'GetJobInput',\n description: 'Input for getting a job by ID',\n fields: {\n jobId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\nconst CancelJobInput = defineSchemaModel({\n name: 'CancelJobInput',\n description: 'Input for cancelling a job',\n fields: {\n jobId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\nconst CancelJobOutput = defineSchemaModel({\n name: 'CancelJobOutput',\n description: 'Output for cancel job operation',\n fields: {\n success: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n },\n});\n\nconst CreateScheduledJobInput = defineSchemaModel({\n name: 'CreateScheduledJobInput',\n description: 'Input for creating a scheduled job',\n fields: {\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n cronExpression: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n timezone: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n jobType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n payload: { type: ScalarTypeEnum.JSON(), isOptional: true },\n maxRetries: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n enabled: { type: ScalarTypeEnum.Boolean(), isOptional: true },\n },\n});\n\nconst ListScheduledJobsOutput = defineSchemaModel({\n name: 'ListScheduledJobsOutput',\n description: 'Output for listing scheduled jobs',\n fields: {\n schedules: { type: ScheduledJobModel, isArray: true, isOptional: false },\n },\n});\n\nconst ToggleScheduledJobInput = defineSchemaModel({\n name: 'ToggleScheduledJobInput',\n description: 'Input for toggling a scheduled job',\n fields: {\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n enabled: { type: ScalarTypeEnum.Boolean(), isOptional: false },\n },\n});\n\n// ============ Event Payloads ============\n\nconst JobEnqueuedPayload = defineSchemaModel({\n name: 'JobEnqueuedPayload',\n description: 'Payload for job.enqueued event',\n fields: {\n jobId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n type: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n priority: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n scheduledAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n tenantId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n enqueuedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nconst JobCancelledPayload = defineSchemaModel({\n name: 'JobCancelledPayload',\n description: 'Payload for job.cancelled event',\n fields: {\n jobId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\n// ============ Contracts ============\n\n/**\n * Enqueue a job.\n */\nexport const EnqueueJobContract = defineCommand({\n meta: {\n key: 'jobs.enqueue',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'enqueue'],\n description: 'Enqueue a background job for async processing.',\n goal: 'Allow services to offload work to background processing.',\n context: 'Called by any service that needs async processing.',\n },\n io: {\n input: EnqueueJobInput,\n output: JobModel,\n },\n policy: {\n auth: 'user',\n },\n sideEffects: {\n emits: [\n {\n key: 'job.enqueued',\n version: '1.0.0',\n when: 'Job is enqueued',\n payload: JobEnqueuedPayload,\n },\n ],\n },\n});\n\n/**\n * Get job by ID.\n */\nexport const GetJobContract = defineQuery({\n meta: {\n key: 'jobs.get',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'get'],\n description: 'Get a job by ID.',\n goal: 'Check job status and result.',\n context: 'Called to poll job status or retrieve results.',\n },\n io: {\n input: GetJobInput,\n output: JobModel,\n },\n policy: {\n auth: 'user',\n },\n});\n\n/**\n * Cancel a job.\n */\nexport const CancelJobContract = defineCommand({\n meta: {\n key: 'jobs.cancel',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'cancel'],\n description: 'Cancel a pending job.',\n goal: 'Allow cancellation of jobs that are no longer needed.',\n context: 'Only pending jobs can be cancelled.',\n },\n io: {\n input: CancelJobInput,\n output: CancelJobOutput,\n errors: {\n JOB_NOT_FOUND: {\n description: 'Job does not exist',\n http: 404,\n gqlCode: 'JOB_NOT_FOUND',\n when: 'Job ID is invalid',\n },\n JOB_NOT_PENDING: {\n description: 'Job is not in pending state',\n http: 409,\n gqlCode: 'JOB_NOT_PENDING',\n when: 'Job has already started or completed',\n },\n },\n },\n policy: {\n auth: 'user',\n },\n sideEffects: {\n emits: [\n {\n key: 'job.cancelled',\n version: '1.0.0',\n when: 'Job is cancelled',\n payload: JobCancelledPayload,\n },\n ],\n },\n});\n\n/**\n * Get queue statistics.\n */\nexport const GetQueueStatsContract = defineQuery({\n meta: {\n key: 'jobs.stats',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'stats', 'admin'],\n description: 'Get job queue statistics.',\n goal: 'Monitor queue health and backlog.',\n context: 'Admin dashboard monitoring.',\n },\n io: {\n input: null,\n output: QueueStatsModel,\n },\n policy: {\n auth: 'admin',\n },\n});\n\n/**\n * Create a scheduled job.\n */\nexport const CreateScheduledJobContract = defineCommand({\n meta: {\n key: 'jobs.schedule.create',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'schedule', 'create'],\n description: 'Create a scheduled/recurring job.',\n goal: 'Set up recurring background tasks.',\n context: 'Admin configuration for periodic tasks.',\n },\n io: {\n input: CreateScheduledJobInput,\n output: ScheduledJobModel,\n },\n policy: {\n auth: 'admin',\n },\n});\n\n/**\n * List scheduled jobs.\n */\nexport const ListScheduledJobsContract = defineQuery({\n meta: {\n key: 'jobs.schedule.list',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'schedule', 'list'],\n description: 'List all scheduled jobs.',\n goal: 'View configured recurring tasks.',\n context: 'Admin dashboard.',\n },\n io: {\n input: null,\n output: ListScheduledJobsOutput,\n },\n policy: {\n auth: 'admin',\n },\n});\n\n/**\n * Toggle scheduled job enabled state.\n */\nexport const ToggleScheduledJobContract = defineCommand({\n meta: {\n key: 'jobs.schedule.toggle',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['jobs', 'schedule', 'toggle'],\n description: 'Enable or disable a scheduled job.',\n goal: 'Control when recurring tasks run.',\n context: 'Admin control over scheduled tasks.',\n },\n io: {\n input: ToggleScheduledJobInput,\n output: ScheduledJobModel,\n },\n policy: {\n auth: 'admin',\n },\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/entities/index.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\nimport type { ModuleSchemaContribution } from '@contractspec/lib.schema';\n\n/**\n * Job status enum.\n */\nexport const JobStatusEnum = defineEntityEnum({\n name: 'JobStatus',\n values: [\n 'PENDING',\n 'RUNNING',\n 'COMPLETED',\n 'FAILED',\n 'CANCELLED',\n 'DEAD_LETTER',\n ] as const,\n schema: 'lssm_jobs',\n description: 'Status of a background job.',\n});\n\n/**\n * Job entity - represents a single job execution.\n */\nexport const JobEntity = defineEntity({\n name: 'Job',\n description: 'A background job for async processing.',\n schema: 'lssm_jobs',\n map: 'job',\n fields: {\n id: field.id({ description: 'Unique job identifier' }),\n type: field.string({ description: 'Job type identifier' }),\n version: field.int({ default: 1, description: 'Job type version' }),\n payload: field.json({ description: 'Job payload data' }),\n status: field.enum('JobStatus', { default: 'PENDING' }),\n priority: field.int({ default: 0, description: 'Higher = more urgent' }),\n\n // Execution tracking\n attempts: field.int({\n default: 0,\n description: 'Number of execution attempts',\n }),\n maxRetries: field.int({\n default: 3,\n description: 'Maximum retry attempts',\n }),\n lastError: field.string({\n isOptional: true,\n description: 'Last error message',\n }),\n lastErrorStack: field.string({\n isOptional: true,\n description: 'Last error stack trace',\n }),\n\n // Timing\n scheduledAt: field.dateTime({\n isOptional: true,\n description: 'When job should be processed',\n }),\n startedAt: field.dateTime({\n isOptional: true,\n description: 'When processing started',\n }),\n completedAt: field.dateTime({\n isOptional: true,\n description: 'When processing completed',\n }),\n timeoutAt: field.dateTime({\n isOptional: true,\n description: 'Job timeout deadline',\n }),\n\n // Deduplication\n dedupeKey: field.string({\n isOptional: true,\n description: 'Key for deduplication',\n }),\n\n // Context\n tenantId: field.string({\n isOptional: true,\n description: 'Tenant/org context',\n }),\n userId: field.string({\n isOptional: true,\n description: 'User who enqueued',\n }),\n traceId: field.string({\n isOptional: true,\n description: 'Distributed trace ID',\n }),\n\n // Metadata\n metadata: field.json({\n isOptional: true,\n description: 'Additional metadata',\n }),\n result: field.json({ isOptional: true, description: 'Job result data' }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n scheduledJob: field.belongsTo('ScheduledJob', ['scheduledJobId'], ['id']),\n scheduledJobId: field.string({ isOptional: true }),\n executions: field.hasMany('JobExecution'),\n },\n indexes: [\n index.on(['status', 'scheduledAt']),\n index.on(['type', 'status']),\n index.on(['tenantId', 'status']),\n index.unique(['dedupeKey'], { name: 'job_dedupe_key_unique' }),\n ],\n enums: [JobStatusEnum],\n});\n\n/**\n * ScheduledJob entity - recurring job definitions.\n */\nexport const ScheduledJobEntity = defineEntity({\n name: 'ScheduledJob',\n description: 'A scheduled/recurring job definition.',\n schema: 'lssm_jobs',\n map: 'scheduled_job',\n fields: {\n id: field.id(),\n name: field.string({ isUnique: true, description: 'Unique schedule name' }),\n description: field.string({ isOptional: true }),\n\n // Schedule definition\n cronExpression: field.string({\n description: 'Cron expression for scheduling',\n }),\n timezone: field.string({\n default: '\"UTC\"',\n description: 'Timezone for cron evaluation',\n }),\n\n // Job template\n jobType: field.string({ description: 'Job type to create' }),\n jobVersion: field.int({ default: 1 }),\n payload: field.json({\n isOptional: true,\n description: 'Default payload for created jobs',\n }),\n\n // Execution settings\n maxRetries: field.int({ default: 3 }),\n timeoutMs: field.int({\n isOptional: true,\n description: 'Job timeout in milliseconds',\n }),\n\n // State\n enabled: field.boolean({ default: true }),\n lastRunAt: field.dateTime({ isOptional: true }),\n nextRunAt: field.dateTime({ isOptional: true }),\n\n // Context\n tenantId: field.string({ isOptional: true }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n jobs: field.hasMany('Job'),\n },\n indexes: [index.on(['enabled', 'nextRunAt'])],\n});\n\n/**\n * JobExecution entity - individual execution attempts.\n */\nexport const JobExecutionEntity = defineEntity({\n name: 'JobExecution',\n description: 'A single execution attempt of a job.',\n schema: 'lssm_jobs',\n map: 'job_execution',\n fields: {\n id: field.id(),\n jobId: field.foreignKey(),\n attemptNumber: field.int({ description: 'Which attempt this is' }),\n\n // Execution details\n startedAt: field.dateTime(),\n completedAt: field.dateTime({ isOptional: true }),\n durationMs: field.int({ isOptional: true }),\n\n // Result\n success: field.boolean({ isOptional: true }),\n error: field.string({ isOptional: true }),\n errorStack: field.string({ isOptional: true }),\n result: field.json({ isOptional: true }),\n\n // Worker info\n workerId: field.string({\n isOptional: true,\n description: 'ID of worker that processed',\n }),\n\n // Relations\n job: field.belongsTo('Job', ['jobId'], ['id'], { onDelete: 'Cascade' }),\n },\n indexes: [index.on(['jobId', 'attemptNumber'])],\n});\n\n/**\n * All job entities for schema composition.\n */\nexport const jobEntities = [JobEntity, ScheduledJobEntity, JobExecutionEntity];\n\n/**\n * Module schema contribution for jobs.\n */\nexport const jobsSchemaContribution: ModuleSchemaContribution = {\n moduleId: '@contractspec/lib.jobs',\n entities: jobEntities,\n enums: [JobStatusEnum],\n};\n"],"mappings":"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"}
|