@cleverbrush/scheduler 1.0.0-beta.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
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 {};
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,84 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobRepository.js","sourceRoot":"","sources":["../src/jobRepository.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,231 @@
1
+ // import fs from 'fs';
2
+ // import { access as fsAccess } from 'fs/promises';
3
+ // import { join as pathJoin } from 'path';
4
+ // import { Worker } from 'worker_threads';
5
+ // import cronParser from 'cron-parser';
6
+ // import {
7
+ // schemaRegistry,
8
+ // JobSchedulerProps,
9
+ // CreateJobRequest,
10
+ // SchedulerStatus,
11
+ // Job,
12
+ // JobInstance
13
+ // } from './types.js';
14
+ // import { IJobRepository, InMemoryJobRepository } from './jobRepository.js';
15
+ // type WorkerResult = {
16
+ // status: 'success' | 'error' | 'timeout';
17
+ // stdout: unknown;
18
+ // stderr: unknown;
19
+ // };
20
+ // const CHECK_INTERVAL = 1000; // every second
21
+ // const SCHEDULE_JOB_SPAN = 1000 * 60 * 60; // 1 hour
22
+ // const DEFAULT_JOB_TIMEOUT = 1000 * 20; // 20 seconds
23
+ // export class JobScheduler {
24
+ // protected _rootFolder: string;
25
+ // protected _status: SchedulerStatus = 'stopped';
26
+ // protected _defaultTimezone: string;
27
+ // protected _checkTimer;
28
+ // protected _jobsRepository: IJobRepository = new InMemoryJobRepository();
29
+ // public get status() {
30
+ // return this._status;
31
+ // }
32
+ // protected set status(val: SchedulerStatus) {
33
+ // if (val === this._status) return;
34
+ // this._status = val;
35
+ // }
36
+ // protected async getJobSchedule(job: Job) {
37
+ // let timeZoneMix: { utc?: boolean; tz?: string } = {
38
+ // utc: true
39
+ // };
40
+ // if (typeof job.timeZone === 'string') {
41
+ // timeZoneMix = {
42
+ // tz: job.timeZone
43
+ // };
44
+ // } else if (typeof this._defaultTimezone === 'string') {
45
+ // timeZoneMix = {
46
+ // tz: this._defaultTimezone
47
+ // };
48
+ // }
49
+ // return cronParser.parseExpression(
50
+ // job.cron,
51
+ // Object.assign(
52
+ // {},
53
+ // timeZoneMix,
54
+ // typeof job.endDate !== 'undefined'
55
+ // ? {
56
+ // endDate: job.endDate
57
+ // }
58
+ // : {}
59
+ // )
60
+ // );
61
+ // }
62
+ // protected runFileWithTimeout(file: string): Promise<WorkerResult> {
63
+ // return new Promise((resolve) => {
64
+ // const worker = new Worker(file, {
65
+ // stderr: true,
66
+ // stdout: true
67
+ // });
68
+ // worker.on('error', () =>
69
+ // resolve({
70
+ // status: 'error',
71
+ // stderr: worker.stderr as any as ReadableStream,
72
+ // stdout: worker.stdout as any as ReadableStream
73
+ // })
74
+ // );
75
+ // worker.on('exit', () =>
76
+ // resolve({
77
+ // status: 'success',
78
+ // stderr: worker.stderr,
79
+ // stdout: worker.stdout
80
+ // })
81
+ // );
82
+ // });
83
+ // }
84
+ // protected async startJobInstance(instance: JobInstance): Promise<void> {
85
+ // await this._jobsRepository.setJobStatus(instance.id, 'active');
86
+ // const job = await this._jobsRepository.getJobById(instance.jobId);
87
+ // const fileName = pathJoin(this._rootFolder, job.path);
88
+ // const workerResult = await this.runFileWithTimeout(fileName);
89
+ // for await (const chunk of workerResult.stdout as any) {
90
+ // console.log(chunk.toString());
91
+ // }
92
+ // // console.log(workerResult.stdout);
93
+ // // workerResult.stdout
94
+ // // return new Promise((res) => {
95
+ // // const timer = setTimeout(() => {
96
+ // // console.log('task finished', instance);
97
+ // // res();
98
+ // // }, 20000);
99
+ // // console.log('task started', instance);
100
+ // // });
101
+ // }
102
+ // protected async scheduleJobTo(job: Job, date: Date): Promise<JobInstance> {
103
+ // let timer;
104
+ // try {
105
+ // const now = new Date();
106
+ // const interval = date.getTime() - now.getTime();
107
+ // console.log(now, date);
108
+ // if (interval < 0) throw new Error('interval is in the past');
109
+ // const instance = await this._jobsRepository.addInstance(job.id, {
110
+ // scheduledTo: date,
111
+ // status: 'scheduled',
112
+ // timeout: job.timeout
113
+ // });
114
+ // console.log(interval);
115
+ // timer = setTimeout(async () => {
116
+ // await this.startJobInstance(instance);
117
+ // console.log('finished');
118
+ // }, interval);
119
+ // return instance;
120
+ // } catch (e) {
121
+ // clearTimeout(timer);
122
+ // console.log(e);
123
+ // console.log('task failed!');
124
+ // }
125
+ // }
126
+ // protected async checkForUpcomingJobs(): Promise<void> {
127
+ // const jobs = await this._jobsRepository.getJobs();
128
+ // for (let i = 0; i < jobs.length; i++) {
129
+ // const schedule = await this.getJobSchedule(jobs[i]);
130
+ // if (schedule.hasNext()) {
131
+ // const scheduledInstances =
132
+ // await this._jobsRepository.getInstancesWithStatus(
133
+ // jobs[i].id,
134
+ // 'scheduled'
135
+ // );
136
+ // const now = new Date().getTime();
137
+ // while (schedule.hasNext()) {
138
+ // const nextRun = schedule.next().toDate();
139
+ // if (nextRun.getTime() - now > SCHEDULE_JOB_SPAN) break;
140
+ // const alreadyScheduled = scheduledInstances.find(
141
+ // (i) => i.scheduledTo.getTime() === nextRun.getTime()
142
+ // );
143
+ // if (alreadyScheduled) continue;
144
+ // await this.scheduleJobTo(jobs[i], nextRun);
145
+ // }
146
+ // } else {
147
+ // await this._jobsRepository.setJobStatus(jobs[i].id, 'finished');
148
+ // }
149
+ // }
150
+ // }
151
+ // public async start() {
152
+ // if (this._status === 'started') {
153
+ // throw new Error('Scheduler is already started');
154
+ // }
155
+ // this.status = 'started';
156
+ // this._checkTimer = setInterval(
157
+ // this.checkForUpcomingJobs.bind(this),
158
+ // CHECK_INTERVAL
159
+ // );
160
+ // // TODO: add logic
161
+ // }
162
+ // public stop() {
163
+ // if (this._status === 'stopped') {
164
+ // throw new Error('Scheduler is already stopped');
165
+ // }
166
+ // clearInterval(this._checkTimer);
167
+ // this.status = 'stopped';
168
+ // // TODO: add logic
169
+ // }
170
+ // public async addJob(job: CreateJobRequest) {
171
+ // const validationResult =
172
+ // await schemaRegistry.schemas.Models.CreateJobRequest.validate(job);
173
+ // if (!validationResult.valid) {
174
+ // throw new Error(
175
+ // `Invalid CreateJobRequest: ${validationResult.errors?.join(
176
+ // '; '
177
+ // )}`
178
+ // );
179
+ // }
180
+ // const path = pathJoin(this._rootFolder, job.path);
181
+ // await fsAccess(path, fs.constants.R_OK);
182
+ // await this._jobsRepository.addJob({
183
+ // createdAt: new Date(),
184
+ // cron: job.cron,
185
+ // endDate: job.endDate,
186
+ // maxRuns: job.maxRuns,
187
+ // timeZone: job.timeZone,
188
+ // timeout: job.timeout || DEFAULT_JOB_TIMEOUT,
189
+ // path: job.path
190
+ // });
191
+ // }
192
+ // constructor(props: JobSchedulerProps) {
193
+ // if (typeof props.rootFolder !== 'string') {
194
+ // throw new Error('rootFolder must be a string');
195
+ // }
196
+ // if (typeof props.defaultTimeZone === 'string') {
197
+ // this._defaultTimezone = props.defaultTimeZone;
198
+ // }
199
+ // if (typeof props.persistRepository === 'object') {
200
+ // this._jobsRepository = props.persistRepository;
201
+ // }
202
+ // this._rootFolder = props.rootFolder;
203
+ // }
204
+ // }
205
+ // // testing area
206
+ // const doWork = async () => {
207
+ // const scheduler = new JobScheduler({
208
+ // rootFolder: '/home/andrew_zol/projects/cleverbrush-libs/libs/scheduler'
209
+ // });
210
+ // await scheduler.addJob({
211
+ // path: 'task1.js',
212
+ // schedule: {
213
+ // every: 'day',
214
+ // span: 1
215
+ // },
216
+ // endDate: new Date(Date.UTC(2022, 7, 17, 18, 0, 0, 0))
217
+ // });
218
+ // scheduler.start();
219
+ // // setTimeout(() => {
220
+ // // console.log('stopping scheduler');
221
+ // // scheduler.stop();
222
+ // // }, 10000);
223
+ // };
224
+ // // doWork();
225
+ // const cron = cronParser.parseExpression('0 8 */14 * *', {
226
+ // startDate: new Date(),
227
+ // endDate: new Date(Date.UTC(2022, 11, 31))
228
+ // });
229
+ // while (cron.hasNext()) {
230
+ // console.log(cron.next().toDate());
231
+ // }