@cleverbrush/scheduler 1.0.0-beta.0 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js DELETED
@@ -1,307 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.JobScheduler = exports.Schemas = exports.ScheduleCalculator = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const events_1 = require("events");
9
- const stream_1 = require("stream");
10
- const promises_1 = require("fs/promises");
11
- const path_1 = require("path");
12
- const worker_threads_1 = require("worker_threads");
13
- const types_js_1 = require("./types.js");
14
- Object.defineProperty(exports, "Schemas", { enumerable: true, get: function () { return types_js_1.Schemas; } });
15
- const ScheduleCalculator_js_1 = require("./ScheduleCalculator.js");
16
- Object.defineProperty(exports, "ScheduleCalculator", { enumerable: true, get: function () { return ScheduleCalculator_js_1.ScheduleCalculator; } });
17
- const jobRepository_js_1 = require("./jobRepository.js");
18
- const CHECK_INTERVAL = 1000 * 10; // every 10 seconds
19
- // const SCHEDULE_JOB_SPAN = 1000 * 60 * 60; // 1 hour
20
- const SCHEDULE_JOB_SPAN = 1000 * 60; // 1 hour
21
- const DEFAULT_JOB_TIMEOUT = 1000 * 20; // 20 seconds
22
- const DEFAULT_MAX_CONSEQUENT_FAILS = 3;
23
- class JobScheduler extends events_1.EventEmitter {
24
- _rootFolder;
25
- _status = 'stopped';
26
- _defaultTimezone;
27
- _checkTimer;
28
- _jobsRepository = new jobRepository_js_1.InMemoryJobRepository();
29
- _jobProps = new Map();
30
- get status() {
31
- return this._status;
32
- }
33
- set status(val) {
34
- if (val === this._status)
35
- return;
36
- this._status = val;
37
- }
38
- scheduleCalculatorCache = new Map();
39
- async getJobSchedule(job) {
40
- if (this.scheduleCalculatorCache.has(job.id)) {
41
- return this.scheduleCalculatorCache.get(job.id);
42
- }
43
- const schedule = {
44
- ...job.schedule
45
- };
46
- if (typeof job.firstInstanceEndedAt !== 'undefined') {
47
- schedule.startsOn = job.firstInstanceEndedAt;
48
- }
49
- if (typeof job.successfullTimesRunned === 'number') {
50
- schedule.startingFromIndex = job.successfullTimesRunned + 1;
51
- }
52
- const res = new ScheduleCalculator_js_1.ScheduleCalculator(schedule);
53
- this.scheduleCalculatorCache.set(job.id, res);
54
- return res;
55
- }
56
- runWorkerWithTimeout(file, props, timeout) {
57
- const worker = new worker_threads_1.Worker(file, {
58
- workerData: props,
59
- execArgv: ['--unhandled-rejections=strict'],
60
- stderr: true,
61
- stdout: true
62
- });
63
- const promise = new Promise((resolve) => {
64
- let timedOut = false;
65
- let isFinished = false;
66
- const timeoutTimer = setTimeout(() => {
67
- if (isFinished)
68
- return;
69
- timedOut = true;
70
- worker.terminate();
71
- resolve({
72
- exitCode: 1,
73
- status: 'timedout'
74
- });
75
- }, timeout);
76
- worker.on('error', (e) => e);
77
- worker.on('exit', (exitCode) => {
78
- if (isFinished)
79
- return;
80
- if (timedOut)
81
- return;
82
- clearTimeout(timeoutTimer);
83
- isFinished = true;
84
- resolve({
85
- status: exitCode === 0 ? 'succeeded' : 'errored',
86
- exitCode
87
- });
88
- });
89
- });
90
- return {
91
- promise,
92
- stderr: worker.stderr,
93
- stdout: worker.stdout
94
- };
95
- }
96
- readToEnd(source) {
97
- return new Promise((res, rej) => {
98
- const chunks = [];
99
- source.on('data', (chunk) => chunks.push(chunk));
100
- source.on('end', () => res(Buffer.concat(chunks)));
101
- source.on('error', (err) => rej(err));
102
- });
103
- }
104
- async startJobInstance(instance) {
105
- const startDate = new Date();
106
- instance = await this._jobsRepository.saveInstance({
107
- ...instance,
108
- status: 'running',
109
- startDate
110
- });
111
- let status, exitCode;
112
- try {
113
- const job = await this._jobsRepository.getJobById(instance.jobId);
114
- const fileName = (0, path_1.join)(this._rootFolder, job.path);
115
- const props = this._jobProps.get(job.id);
116
- let finalProps = typeof props === 'function' ? props() : props;
117
- if (finalProps instanceof Promise) {
118
- finalProps = await finalProps;
119
- }
120
- instance = await this._jobsRepository.saveInstance({
121
- ...instance,
122
- status: 'running'
123
- });
124
- const { promise, stderr, stdout } = this.runWorkerWithTimeout(fileName, finalProps, job.timeout);
125
- const stdOutPass = new stream_1.PassThrough();
126
- stdout.pipe(stdOutPass);
127
- const stdErrPass = new stream_1.PassThrough();
128
- stderr.pipe(stdErrPass);
129
- const stdOutForJobStart = stdout.pipe(new stream_1.PassThrough());
130
- const stdErrForJobStart = stderr.pipe(new stream_1.PassThrough());
131
- const stdOutForJobEnd = stdout.pipe(new stream_1.PassThrough());
132
- const stdErrForJobEnd = stderr.pipe(new stream_1.PassThrough());
133
- this.emit('job:start', {
134
- instanceId: instance.id,
135
- jobId: job.id,
136
- stderr: stdErrForJobStart,
137
- stdout: stdOutForJobStart,
138
- startDate
139
- });
140
- const stdOutStr = (await this.readToEnd(stdOutPass)).toString();
141
- const stdErrStr = (await this.readToEnd(stdErrPass)).toString();
142
- const result = await promise;
143
- status = result.status;
144
- exitCode = result.exitCode;
145
- const endDate = new Date();
146
- this.emit('job:end', {
147
- instanceId: instance.id,
148
- jobId: job.id,
149
- stderr: stdErrForJobEnd,
150
- stdout: stdOutForJobEnd,
151
- startDate,
152
- endDate
153
- });
154
- instance = await this._jobsRepository.saveInstance({
155
- ...instance,
156
- status,
157
- exitCode,
158
- stdErr: stdErrStr,
159
- stdOut: stdOutStr,
160
- endDate
161
- });
162
- }
163
- finally {
164
- const job = {
165
- ...(await this._jobsRepository.getJobById(instance.jobId))
166
- };
167
- job.timesRunned++;
168
- let shouldRetry = false;
169
- const schedule = await this.getJobSchedule(job);
170
- if (status !== 'succeeded') {
171
- if (job.consequentFailsCount + 1 >= job.maxConsequentFails) {
172
- job.status = 'disabled';
173
- }
174
- else {
175
- job.consequentFailsCount += 1;
176
- shouldRetry = true;
177
- }
178
- }
179
- else {
180
- job.successfullTimesRunned++;
181
- job.consequentFailsCount = 0;
182
- if (!schedule.hasNext()) {
183
- job.status = 'finished';
184
- }
185
- }
186
- await this._jobsRepository.saveJob(job);
187
- if (shouldRetry) {
188
- await this.startJobInstance(instance);
189
- }
190
- }
191
- }
192
- async scheduleJobTo(job, date, index) {
193
- let timer;
194
- try {
195
- const now = new Date();
196
- let interval = date.getTime() - now.getTime();
197
- if (interval < 0) {
198
- interval = 0;
199
- }
200
- const instance = await this._jobsRepository.addInstance(job.id, {
201
- scheduledTo: date,
202
- status: 'scheduled',
203
- timeout: job.timeout,
204
- index
205
- });
206
- timer = setTimeout(async () => {
207
- const actualJob = await this._jobsRepository.getJobById(job.id);
208
- if (actualJob.status !== 'active') {
209
- instance.status = 'canceled';
210
- await this._jobsRepository.saveInstance(instance);
211
- return;
212
- }
213
- await this.startJobInstance(instance);
214
- }, interval);
215
- return instance;
216
- }
217
- catch (e) {
218
- clearTimeout(timer);
219
- // console.log(e);
220
- // console.log('task failed!');
221
- return null;
222
- }
223
- }
224
- async checkForUpcomingJobs() {
225
- const jobs = await this._jobsRepository.getJobs();
226
- for (let i = 0; i < jobs.length; i++) {
227
- if (jobs[i].status !== 'active')
228
- continue;
229
- const schedule = await this.getJobSchedule(jobs[i]);
230
- if (schedule.hasNext()) {
231
- const scheduledInstances = await this._jobsRepository.getInstancesWithStatus(jobs[i].id, 'scheduled');
232
- while (schedule.hasNext(SCHEDULE_JOB_SPAN)) {
233
- const { date: nextRun, index } = schedule.next();
234
- const alreadyScheduled = scheduledInstances.find((i) => i.index === index);
235
- if (alreadyScheduled)
236
- continue;
237
- await this.scheduleJobTo(jobs[i], nextRun, index);
238
- }
239
- }
240
- else {
241
- jobs[i].status = 'finished';
242
- await this._jobsRepository.saveJob(jobs[i]);
243
- }
244
- }
245
- }
246
- async start() {
247
- if (this._status === 'started') {
248
- throw new Error('Scheduler is already started');
249
- }
250
- this.status = 'started';
251
- this._checkTimer = setInterval(this.checkForUpcomingJobs.bind(this), CHECK_INTERVAL);
252
- // TODO: add logic
253
- }
254
- stop() {
255
- if (this._status === 'stopped') {
256
- throw new Error('Scheduler is already stopped');
257
- }
258
- clearInterval(this._checkTimer);
259
- this.status = 'stopped';
260
- // TODO: add logic
261
- }
262
- async addJob(job) {
263
- const validationResult = await types_js_1.schemaRegistry.schemas.Models.CreateJobRequest.validate(job);
264
- if (!validationResult.valid) {
265
- throw new Error(`Invalid CreateJobRequest: ${validationResult.errors?.join('; ')}`);
266
- }
267
- const path = (0, path_1.join)(this._rootFolder, job.path);
268
- await (0, promises_1.access)(path, fs_1.default.constants.R_OK);
269
- this._jobProps.set(job.id, job.props);
270
- await this._jobsRepository.createJob({
271
- id: job.id,
272
- createdAt: new Date(),
273
- schedule: job.schedule,
274
- timeout: job.timeout || DEFAULT_JOB_TIMEOUT,
275
- path: job.path,
276
- consequentFailsCount: 0,
277
- timesRunned: 0,
278
- successfullTimesRunned: 0,
279
- maxConsequentFails: typeof job.maxConsequentFails === 'number'
280
- ? job.maxConsequentFails
281
- : DEFAULT_MAX_CONSEQUENT_FAILS
282
- });
283
- }
284
- constructor(props) {
285
- super();
286
- if (typeof props.rootFolder !== 'string') {
287
- throw new Error('rootFolder must be a string');
288
- }
289
- if (typeof props.defaultTimeZone === 'string') {
290
- this._defaultTimezone = props.defaultTimeZone;
291
- }
292
- if (typeof props.persistRepository === 'object') {
293
- this._jobsRepository = props.persistRepository;
294
- }
295
- this._rootFolder = props.rootFolder;
296
- setInterval(() => {
297
- this._jobsRepository.dumpJobs();
298
- this._jobsRepository.dumpInstances();
299
- }, 10 * 1000);
300
- }
301
- on(name, callback) {
302
- super.on(name, callback);
303
- return this;
304
- }
305
- }
306
- exports.JobScheduler = JobScheduler;
307
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import { Job, JobInstance, JobInstanceStatus, JobStatus } from './types.js';
2
- declare type AddJobRequest = Omit<Job, 'status'>;
3
- declare type AddJobInstanceRequest = Omit<JobInstance, 'id' | 'jobId'>;
4
- export interface IJobRepository {
5
- getJobs(): Promise<Job[]>;
6
- getJobById(jobId: string): Promise<Job>;
7
- createJob(item: AddJobRequest): Promise<Job>;
8
- saveJob(job: Job): Promise<Job>;
9
- getInstancesWithStatus(jobId: string, status: JobInstanceStatus): Promise<JobInstance[]>;
10
- addInstance(jobId: string, instance: AddJobInstanceRequest): Promise<JobInstance>;
11
- saveInstance(instance: JobInstance): Promise<JobInstance>;
12
- dumpJobs(): void;
13
- dumpInstances(): void;
14
- }
15
- export declare class InMemoryJobRepository implements IJobRepository {
16
- private _jobs;
17
- private _jobInstances;
18
- private _instanceId;
19
- getJobs(): Promise<Job[]>;
20
- createJob(item: AddJobRequest): Promise<Job>;
21
- getInstances(jobId: string): Promise<JobInstance[]>;
22
- addInstance(jobId: string, instance: AddJobInstanceRequest): Promise<JobInstance>;
23
- getJobById(jobId: string): Promise<Job>;
24
- setJobStatus(jobId: string, status: JobStatus): Promise<Job>;
25
- saveJob(job: Job): Promise<Job>;
26
- getInstancesWithStatus(jobId: string, status: JobInstanceStatus): Promise<JobInstance[]>;
27
- getInstanceById(id: number): Promise<JobInstance>;
28
- saveInstance(instance: JobInstance): Promise<JobInstance>;
29
- dumpJobs(): void;
30
- dumpInstances(): void;
31
- }
32
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"jobRepository.d.ts","sourceRoot":"","sources":["../src/jobRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5E,aAAK,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACzC,aAAK,qBAAqB,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC3B,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhC,sBAAsB,CAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAiB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1B,WAAW,CACP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,GAChC,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAG1D,QAAQ,IAAI,IAAI,CAAC;IACjB,aAAa,IAAI,IAAI,CAAC;CACzB;AAED,qBAAa,qBAAsB,YAAW,cAAc;IACxD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,WAAW,CAAK;IAElB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAIzB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAS5C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAInD,WAAW,CACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,GAChC,OAAO,CAAC,WAAW,CAAC;IAYjB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIvC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;IAO5D,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAiB/B,sBAAsB,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAiB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC;IAMnB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIjD,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAoB/D,QAAQ,IAAI,IAAI;IAIhB,aAAa,IAAI,IAAI;CAGxB"}
@@ -1,84 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InMemoryJobRepository = void 0;
4
- class InMemoryJobRepository {
5
- _jobs = [];
6
- _jobInstances = [];
7
- _instanceId = 1;
8
- async getJobs() {
9
- return this._jobs;
10
- }
11
- async createJob(item) {
12
- const job = {
13
- ...item,
14
- status: 'active'
15
- };
16
- this._jobs.push(job);
17
- return job;
18
- }
19
- async getInstances(jobId) {
20
- return this._jobInstances.filter((ji) => ji.jobId === jobId);
21
- }
22
- async addInstance(jobId, instance) {
23
- const newInstance = {
24
- ...instance,
25
- id: this._instanceId++,
26
- jobId
27
- };
28
- this._jobInstances.push(newInstance);
29
- return newInstance;
30
- }
31
- async getJobById(jobId) {
32
- return this._jobs.find((j) => j.id === jobId);
33
- }
34
- async setJobStatus(jobId, status) {
35
- const job = await this.getJobById(jobId);
36
- if (!job)
37
- return null;
38
- job.status = status;
39
- return job;
40
- }
41
- async saveJob(job) {
42
- const index = this._jobs.findIndex((j) => j.id === job.id);
43
- if (index !== -1) {
44
- this._jobs[index] = {
45
- ...job
46
- };
47
- return this._jobs[index];
48
- }
49
- const result = {
50
- ...job
51
- };
52
- this._jobs.push(result);
53
- return result;
54
- }
55
- async getInstancesWithStatus(jobId, status) {
56
- return (await this.getInstances(jobId)).filter((i) => i.status === status);
57
- }
58
- async getInstanceById(id) {
59
- return this._jobInstances.find((ji) => ji.id === id);
60
- }
61
- async saveInstance(instance) {
62
- const oldIndex = this._jobInstances.findIndex((ji) => ji.id === instance.id);
63
- if (oldIndex !== -1) {
64
- this._jobInstances[oldIndex] = {
65
- ...instance
66
- };
67
- return this._jobInstances[oldIndex];
68
- }
69
- const result = {
70
- ...instance,
71
- id: this._instanceId++
72
- };
73
- this._jobInstances.push(result);
74
- return result;
75
- }
76
- dumpJobs() {
77
- // console.table(this._jobs);
78
- }
79
- dumpInstances() {
80
- // console.table(this._jobInstances);
81
- }
82
- }
83
- exports.InMemoryJobRepository = InMemoryJobRepository;
84
- //# sourceMappingURL=jobRepository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jobRepository.js","sourceRoot":"","sources":["../src/jobRepository.ts"],"names":[],"mappings":"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"}
package/dist/reports.d.ts DELETED
File without changes