anbaric-state-machine 1.23.2 → 1.25.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/StateMachine.d.ts +5 -2
- package/dist/StateMachine.d.ts.map +1 -1
- package/dist/StateMachine.js +38 -2
- package/dist/StateMachine.js.map +1 -1
- package/dist/actors/Human.d.ts.map +1 -1
- package/dist/actors/Human.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/notifications/NotifierFactory.d.ts +7 -0
- package/dist/notifications/NotifierFactory.d.ts.map +1 -0
- package/dist/notifications/NotifierFactory.js +16 -0
- package/dist/notifications/NotifierFactory.js.map +1 -0
- package/dist/scheduling/ConsumerFactory.d.ts.map +1 -1
- package/dist/scheduling/ConsumerFactory.js +30 -5
- package/dist/scheduling/ConsumerFactory.js.map +1 -1
- package/dist/scheduling/InMemoryJobRunSchedulePersistence.d.ts +10 -0
- package/dist/scheduling/InMemoryJobRunSchedulePersistence.d.ts.map +1 -0
- package/dist/scheduling/InMemoryJobRunSchedulePersistence.js +29 -0
- package/dist/scheduling/InMemoryJobRunSchedulePersistence.js.map +1 -0
- package/dist/scheduling/JobRunSchedulePersistenceFactory.d.ts +6 -0
- package/dist/scheduling/JobRunSchedulePersistenceFactory.d.ts.map +1 -0
- package/dist/scheduling/JobRunSchedulePersistenceFactory.js +15 -0
- package/dist/scheduling/JobRunSchedulePersistenceFactory.js.map +1 -0
- package/dist/scheduling/JobRunScheduler.d.ts +24 -0
- package/dist/scheduling/JobRunScheduler.d.ts.map +1 -0
- package/dist/scheduling/JobRunScheduler.js +106 -0
- package/dist/scheduling/JobRunScheduler.js.map +1 -0
- package/dist/scheduling/Schedule.d.ts +16 -0
- package/dist/scheduling/Schedule.d.ts.map +1 -0
- package/dist/scheduling/Schedule.js +39 -0
- package/dist/scheduling/Schedule.js.map +1 -0
- package/package.json +3 -3
package/dist/StateMachine.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Action, Actor, AppAware, Auditor, Job, JobPersistence, PropertyDefinition, Queue, State } from "anbaric-tsapi";
|
|
1
|
+
import { Action, Actor, AppAware, Auditor, Job, JobPersistence, Notifier, PropertyDefinition, Queue, State } from "anbaric-tsapi";
|
|
2
2
|
declare class StateMachine implements AppAware {
|
|
3
3
|
readonly workflowId: string;
|
|
4
4
|
readonly states: Map<string, State>;
|
|
@@ -8,15 +8,18 @@ declare class StateMachine implements AppAware {
|
|
|
8
8
|
private queue;
|
|
9
9
|
private consumer;
|
|
10
10
|
private machineActor;
|
|
11
|
+
private notifier;
|
|
11
12
|
private auditor;
|
|
12
13
|
private readonly NO_TRANSITION_REQUEUE_DELAY;
|
|
13
|
-
constructor(workflowId: string, states: Array<State>, startState?: string, dataSchema?: Array<PropertyDefinition>, persistence?: JobPersistence, queue?: Queue, auditor?: Auditor);
|
|
14
|
+
constructor(workflowId: string, states: Array<State>, startState?: string, dataSchema?: Array<PropertyDefinition>, persistence?: JobPersistence, queue?: Queue, notifier?: Notifier | undefined, auditor?: Auditor);
|
|
14
15
|
getAppId(): string;
|
|
15
16
|
private describe;
|
|
16
17
|
startJob(properties?: Map<string, any>, actor?: Actor): Promise<Job>;
|
|
17
18
|
updateJob(jobId: string, properties: Map<string, any>, actor: Actor): Promise<void>;
|
|
18
19
|
executeAction(jobId: string, action: Action): Promise<void>;
|
|
19
20
|
private progressJob;
|
|
21
|
+
private notifyWaitingOn;
|
|
22
|
+
private failJob;
|
|
20
23
|
private updateJobInternal;
|
|
21
24
|
private validateProperties;
|
|
22
25
|
private propertyProblem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EAIP,GAAG,EACH,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,KAAK,EAGR,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EAIP,GAAG,EACH,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,KAAK,EACL,KAAK,EAGR,MAAM,eAAe,CAAC;AASvB,cAAM,YAAa,YAAW,QAAQ;IAElC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAErD,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAsB;IAElE,YAAY,UAAU,EAAG,MAAM,EAAE,MAAM,EAAG,KAAK,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,EAAG,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAM,EAAE,WAAW,GAAG,cAAiD,EAAE,KAAK,GAAG,KAA+B,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAsC,EAAE,OAAO,GAAG,OAAmC,EAqB/U;IAED,QAAQ,IAAK,MAAM,CAElB;IAED,OAAO,CAAC,QAAQ;IAKV,QAAQ,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,KAAyB,GAAG,OAAO,CAAC,GAAG,CAAC,CAY7F;IAEK,SAAS,CAAC,KAAK,EAAG,MAAM,EAAE,UAAU,EAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAG,KAAK,GAAI,OAAO,CAAC,IAAI,CAAC,CAO5F;IAEK,aAAa,CAAC,KAAK,EAAG,MAAM,EAAE,MAAM,EAAG,MAAM,GAAI,OAAO,CAAC,IAAI,CAAC,CAcnE;YAEa,WAAW;YAwFX,eAAe;YAgBf,OAAO;YAUP,iBAAiB;IAQ/B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,SAAS;IAIX,OAAO,IAAK,OAAO,CAAC,IAAI,CAAC,CAE9B;IAED,OAAO,CAAC,cAAc;CAIzB;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/StateMachine.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Await, currentAppId, Job, SystemActor, WorkflowDefinition } from "anbaric-tsapi";
|
|
2
2
|
import { JobPersistenceFactory } from "./persistence/JobPersistenceFactory.js";
|
|
3
3
|
import { QueueFactory } from "./scheduling/QueueFactory.js";
|
|
4
|
+
import { NotifierFactory } from "./notifications/NotifierFactory.js";
|
|
4
5
|
import { ConsumerFactory } from "./scheduling/ConsumerFactory.js";
|
|
5
6
|
import { AuditorFactory } from "./auditing/AuditorFactory.js";
|
|
6
7
|
import { Code } from "./actors/Code.js";
|
|
@@ -13,9 +14,10 @@ class StateMachine {
|
|
|
13
14
|
queue;
|
|
14
15
|
consumer;
|
|
15
16
|
machineActor;
|
|
17
|
+
notifier;
|
|
16
18
|
auditor;
|
|
17
19
|
NO_TRANSITION_REQUEUE_DELAY = 5 * 60_000;
|
|
18
|
-
constructor(workflowId, states, startState, dataSchema = [], persistence = JobPersistenceFactory.instance(), queue = QueueFactory.instance(), auditor = AuditorFactory.instance()) {
|
|
20
|
+
constructor(workflowId, states, startState, dataSchema = [], persistence = JobPersistenceFactory.instance(), queue = QueueFactory.instance(), notifier = NotifierFactory.instance(), auditor = AuditorFactory.instance()) {
|
|
19
21
|
// The workflow's identity is the composite (appId, workflowId): the app
|
|
20
22
|
// it is deployed in (from the environment, via getAppId()) and the
|
|
21
23
|
// machine's own id, kept as separate values rather than a concatenated
|
|
@@ -26,6 +28,7 @@ class StateMachine {
|
|
|
26
28
|
this.dataSchema = new Map(dataSchema.map(property => [property.id, property]));
|
|
27
29
|
this.persistence = persistence;
|
|
28
30
|
this.queue = queue;
|
|
31
|
+
this.notifier = notifier;
|
|
29
32
|
this.machineActor = new Code(this.workflowId, "state-machine");
|
|
30
33
|
this.auditor = auditor;
|
|
31
34
|
this.consumer = ConsumerFactory.instance(queue);
|
|
@@ -88,13 +91,20 @@ class StateMachine {
|
|
|
88
91
|
job.awaitMetadata = item.waitForInput(job);
|
|
89
92
|
job.waitingFor = crypto.randomUUID();
|
|
90
93
|
await this.persistence.save(this.machineActor, `Job ${job.id} awaiting input`, job, propertiesChanged ? job.properties : undefined);
|
|
94
|
+
await this.notifyWaitingOn(item, job);
|
|
91
95
|
return;
|
|
92
96
|
}
|
|
93
97
|
if (!item.predicate(job))
|
|
94
98
|
continue;
|
|
95
99
|
if (!this.authorizeActor(item.actor, job))
|
|
96
100
|
continue;
|
|
97
|
-
|
|
101
|
+
let newProperties;
|
|
102
|
+
try {
|
|
103
|
+
newProperties = await item.run(job);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return this.failJob(job, item, error);
|
|
107
|
+
}
|
|
98
108
|
let applied = false;
|
|
99
109
|
for (const [key, value] of newProperties) {
|
|
100
110
|
const problem = this.propertyProblem(key, value);
|
|
@@ -138,6 +148,32 @@ class StateMachine {
|
|
|
138
148
|
await this.persistence.save(involvedActors[0] ?? this.machineActor, `Job ${job.id} progressed automatically`, job, job.properties);
|
|
139
149
|
await this.queue.schedule(job.id, this.getAppId(), this.workflowId, new Date(Date.now() + this.NO_TRANSITION_REQUEUE_DELAY));
|
|
140
150
|
}
|
|
151
|
+
/* Told after the job is parked, so the people notified can act on it the
|
|
152
|
+
moment they read the message. Notifying is a side channel: a notifier
|
|
153
|
+
that fails must not undo a job that is already legitimately waiting, so
|
|
154
|
+
the failure is logged and the job left alone. */
|
|
155
|
+
async notifyWaitingOn(waiting, job) {
|
|
156
|
+
if (!this.notifier || waiting.notify.length === 0 || !job.awaitMetadata)
|
|
157
|
+
return;
|
|
158
|
+
try {
|
|
159
|
+
await this.notifier.notify(waiting.notify, job, job.awaitMetadata);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
163
|
+
console.error(`[${this.workflowId}] could not notify ${waiting.notify.join(", ")} that job ${job.id} is waiting: ${reason}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/* An action that throws used to leave the job silently stuck: the queue
|
|
167
|
+
message was never confirmed, so the job neither advanced nor visibly
|
|
168
|
+
failed. Failing it here marks the job, records why in the audit trail,
|
|
169
|
+
and lets the consumer confirm the message. An update that moves the job
|
|
170
|
+
on clears the status, so a failure is recoverable rather than terminal. */
|
|
171
|
+
async failJob(job, action, error) {
|
|
172
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
173
|
+
job.status = Job.Status.FAILED;
|
|
174
|
+
console.error(`[${this.workflowId}] action "${action.name}" threw on job ${job.id}: ${reason}`);
|
|
175
|
+
await this.persistence.save(action.actor, `Action "${action.name}" failed on job ${job.id}: ${reason}`, job);
|
|
176
|
+
}
|
|
141
177
|
async updateJobInternal(actor, message, job, newProperties, newState) {
|
|
142
178
|
if (newProperties && !this.validateProperties(newProperties, false))
|
|
143
179
|
throw new Error("Invalid properties");
|
package/dist/StateMachine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,KAAK,EAEL,YAAY,EACZ,GAAG,
|
|
1
|
+
{"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Human.d.ts","sourceRoot":"","sources":["../../src/actors/Human.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAIrD,cAAM,KAAM,YAAW,KAAK;IAExB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/B,YAAY,EAAE,EAAG,MAAM,EAAE,KAAK,EAAG,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,EAGtD;IAOD,OAAa,WAAW,CAAC,MAAM,EAAG,MAAM,GAAG,eAAe,EACjC,QAAQ,GAAG,eAAmD,GAAI,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"Human.d.ts","sourceRoot":"","sources":["../../src/actors/Human.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAIrD,cAAM,KAAM,YAAW,KAAK;IAExB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/B,YAAY,EAAE,EAAG,MAAM,EAAE,KAAK,EAAG,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,EAGtD;IAOD,OAAa,WAAW,CAAC,MAAM,EAAG,MAAM,GAAG,eAAe,EACjC,QAAQ,GAAG,eAAmD,GAAI,OAAO,CAAC,KAAK,CAAC,CAMxG;CAEJ;AAED,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
package/dist/actors/Human.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Human.js","sourceRoot":"","sources":["../../src/actors/Human.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,sBAAsB,EAAC,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAE3D,MAAM,KAAK;IAEE,IAAI,GAAG,OAAgB,CAAC;IACxB,EAAE,CAAU;IACZ,KAAK,CAAiB;IAE/B,YAAY,EAAW,EAAE,KAA8B;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED;;;;gBAIY;IACZ,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAiC,EACjC,QAAQ,GAAqB,sBAAsB,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"Human.js","sourceRoot":"","sources":["../../src/actors/Human.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,sBAAsB,EAAC,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAE3D,MAAM,KAAK;IAEE,IAAI,GAAG,OAAgB,CAAC;IACxB,EAAE,CAAU;IACZ,KAAK,CAAiB;IAE/B,YAAY,EAAW,EAAE,KAA8B;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED;;;;gBAIY;IACZ,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAiC,EACjC,QAAQ,GAAqB,sBAAsB,CAAC,QAAQ,EAAE;QAEnF,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,IAAI,CAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CAEJ;AAED,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export * from "./scheduling/InMemoryQueue.js";
|
|
|
11
11
|
export * from "./scheduling/PullConsumer.js";
|
|
12
12
|
export * from "./scheduling/ConsumerFactory.js";
|
|
13
13
|
export * from "./scheduling/QueueFactory.js";
|
|
14
|
+
export * from "./notifications/NotifierFactory.js";
|
|
15
|
+
export * from "./scheduling/Schedule.js";
|
|
16
|
+
export * from "./scheduling/JobRunScheduler.js";
|
|
17
|
+
export * from "./scheduling/InMemoryJobRunSchedulePersistence.js";
|
|
18
|
+
export * from "./scheduling/JobRunSchedulePersistenceFactory.js";
|
|
14
19
|
export * from "./sessions/InMemorySessionResolver.js";
|
|
15
20
|
export * from "./sessions/SessionResolverFactory.js";
|
|
16
21
|
export * from "./sessions/sessionCookie.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,11 @@ export * from "./scheduling/InMemoryQueue.js";
|
|
|
11
11
|
export * from "./scheduling/PullConsumer.js";
|
|
12
12
|
export * from "./scheduling/ConsumerFactory.js";
|
|
13
13
|
export * from "./scheduling/QueueFactory.js";
|
|
14
|
+
export * from "./notifications/NotifierFactory.js";
|
|
15
|
+
export * from "./scheduling/Schedule.js";
|
|
16
|
+
export * from "./scheduling/JobRunScheduler.js";
|
|
17
|
+
export * from "./scheduling/InMemoryJobRunSchedulePersistence.js";
|
|
18
|
+
export * from "./scheduling/JobRunSchedulePersistenceFactory.js";
|
|
14
19
|
export * from "./sessions/InMemorySessionResolver.js";
|
|
15
20
|
export * from "./sessions/SessionResolverFactory.js";
|
|
16
21
|
export * from "./sessions/sessionCookie.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kDAAkD,CAAC;AACjE,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotifierFactory.d.ts","sourceRoot":"","sources":["../../src/notifications/NotifierFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAUvC,QAAA,MAAM,eAAe;IAEjB,GAAG,WAAY,QAAQ,GAAG,SAAS,GAAI,IAAI;IAI3C,QAAQ,IAAK,QAAQ,GAAG,SAAS;CAIpC,CAAA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* Unlike the other factories there is no local implementation to fall back on:
|
|
2
|
+
nothing sensible can be delivered from a laptop, so running outside a
|
|
3
|
+
platform yields undefined and a state machine simply doesn't notify. A host
|
|
4
|
+
that can deliver registers one during start-up, before any state machine is
|
|
5
|
+
constructed, and every machine built afterwards picks it up. */
|
|
6
|
+
let registered;
|
|
7
|
+
const NotifierFactory = {
|
|
8
|
+
use(notifier) {
|
|
9
|
+
registered = notifier;
|
|
10
|
+
},
|
|
11
|
+
instance() {
|
|
12
|
+
return registered;
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export { NotifierFactory };
|
|
16
|
+
//# sourceMappingURL=NotifierFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotifierFactory.js","sourceRoot":"","sources":["../../src/notifications/NotifierFactory.ts"],"names":[],"mappings":"AAEA;;;;kEAIkE;AAElE,IAAI,UAAiC,CAAC;AAEtC,MAAM,eAAe,GAAG;IAEpB,GAAG,CAAC,QAA+B;QAC/B,UAAU,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,QAAQ;QACJ,OAAO,UAAU,CAAC;IACtB,CAAC;CAEJ,CAAA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsumerFactory.d.ts","sourceRoot":"","sources":["../../src/scheduling/ConsumerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAW,KAAK,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ConsumerFactory.d.ts","sourceRoot":"","sources":["../../src/scheduling/ConsumerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAW,KAAK,EAAC,MAAM,eAAe,CAAC;AAwBvD,QAAA,MAAM,eAAe;IAEjB,QAAQ,QAAS,KAAK,GAAI,QAAQ;CAmBrC,CAAA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
import { Dequeue } from "anbaric-tsapi";
|
|
2
2
|
import { PushConsumer } from "anbaric-impl-cloud";
|
|
3
3
|
import { PullConsumer } from "./PullConsumer.js";
|
|
4
|
+
/* Consumers are shared rather than made per state machine. A push consumer
|
|
5
|
+
binds a port, so giving every machine its own meant the second machine in a
|
|
6
|
+
deployed app died on EADDRINUSE - an app could only ever have one machine.
|
|
7
|
+
Both consumers already key their subscribers by (appId, workflowId), so one
|
|
8
|
+
shared consumer dispatches each message to the right machine.
|
|
9
|
+
|
|
10
|
+
Neither is shared globally, because a consumer is only interchangeable with
|
|
11
|
+
another that talks to the same place. Pull consumers are shared per queue: a
|
|
12
|
+
machine built with its own queue still needs that queue drained, and
|
|
13
|
+
QueueFactory hands out a separate in-memory queue on every call. Push
|
|
14
|
+
consumers are shared per platform, since a consumer registers its callback
|
|
15
|
+
URL with one platform and confirms messages back to it. A process talks to a
|
|
16
|
+
single platform, so in a deployed app that is one consumer on one port. */
|
|
17
|
+
const pullConsumers = new WeakMap();
|
|
18
|
+
const pushConsumers = new Map();
|
|
19
|
+
const platform = () => process.env.ANBARIC_CLOUD_URL ?? "";
|
|
4
20
|
const ConsumerFactory = {
|
|
5
21
|
instance(queue) {
|
|
6
22
|
if (Dequeue.supports(queue)) {
|
|
7
|
-
|
|
23
|
+
const existing = pullConsumers.get(queue);
|
|
24
|
+
if (existing)
|
|
25
|
+
return existing;
|
|
26
|
+
const consumer = new PullConsumer(queue);
|
|
27
|
+
pullConsumers.set(queue, consumer);
|
|
28
|
+
return consumer;
|
|
8
29
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
30
|
+
const platformUrl = platform();
|
|
31
|
+
const existing = pushConsumers.get(platformUrl);
|
|
32
|
+
if (existing)
|
|
33
|
+
return existing;
|
|
34
|
+
const consumer = new PushConsumer();
|
|
35
|
+
pushConsumers.set(platformUrl, consumer);
|
|
36
|
+
return consumer;
|
|
37
|
+
},
|
|
13
38
|
};
|
|
14
39
|
export { ConsumerFactory };
|
|
15
40
|
//# sourceMappingURL=ConsumerFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsumerFactory.js","sourceRoot":"","sources":["../../src/scheduling/ConsumerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAQ,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C,MAAM,eAAe,GAAG;
|
|
1
|
+
{"version":3,"file":"ConsumerFactory.js","sourceRoot":"","sources":["../../src/scheduling/ConsumerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAQ,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;6EAY6E;AAE7E,MAAM,aAAa,GAAG,IAAI,OAAO,EAAyB,CAAC;AAE3D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;AAE3D,MAAM,eAAe,GAAG;IAEpB,QAAQ,CAAC,KAAa;QAClB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAE9B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;YACzC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACnC,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACpC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACpB,CAAC;CAEJ,CAAA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { JobRunSchedulePersistence, ScheduledRun } from "anbaric-tsapi";
|
|
2
|
+
declare class InMemoryJobRunSchedulePersistence implements JobRunSchedulePersistence {
|
|
3
|
+
private runs;
|
|
4
|
+
highWaterMark(appId: string, workflowId: string): Promise<Date | undefined>;
|
|
5
|
+
plan(runs: Array<ScheduledRun>): Promise<void>;
|
|
6
|
+
claimDue(at: Date): Promise<Array<ScheduledRun>>;
|
|
7
|
+
private alreadyPlanned;
|
|
8
|
+
}
|
|
9
|
+
export { InMemoryJobRunSchedulePersistence };
|
|
10
|
+
//# sourceMappingURL=InMemoryJobRunSchedulePersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryJobRunSchedulePersistence.d.ts","sourceRoot":"","sources":["../../src/scheduling/InMemoryJobRunSchedulePersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,yBAAyB,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AAItE,cAAM,iCAAkC,YAAW,yBAAyB;IAExE,OAAO,CAAC,IAAI,CAA0B;IAEhC,aAAa,CAAC,KAAK,EAAG,MAAM,EAAE,UAAU,EAAG,MAAM,GAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKnF;IAEK,IAAI,CAAC,IAAI,EAAG,KAAK,CAAC,YAAY,CAAC,GAAI,OAAO,CAAC,IAAI,CAAC,CAKrD;IAEK,QAAQ,CAAC,EAAE,EAAG,IAAI,GAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAIvD;IAED,OAAO,CAAC,cAAc;CAOzB;AAED,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class InMemoryJobRunSchedulePersistence {
|
|
2
|
+
runs = [];
|
|
3
|
+
async highWaterMark(appId, workflowId) {
|
|
4
|
+
const times = this.runs
|
|
5
|
+
.filter(run => run.appId === appId && run.workflowId === workflowId)
|
|
6
|
+
.map(run => run.runAt.getTime());
|
|
7
|
+
return times.length === 0 ? undefined : new Date(Math.max(...times));
|
|
8
|
+
}
|
|
9
|
+
async plan(runs) {
|
|
10
|
+
for (const run of runs) {
|
|
11
|
+
if (this.alreadyPlanned(run))
|
|
12
|
+
continue;
|
|
13
|
+
this.runs.push({ ...run, claimed: false });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async claimDue(at) {
|
|
17
|
+
const due = this.runs.filter(run => !run.claimed && run.runAt.getTime() <= at.getTime());
|
|
18
|
+
for (const run of due)
|
|
19
|
+
run.claimed = true;
|
|
20
|
+
return due.map(({ appId, workflowId, runAt }) => ({ appId, workflowId, runAt }));
|
|
21
|
+
}
|
|
22
|
+
alreadyPlanned(run) {
|
|
23
|
+
return this.runs.some(planned => planned.appId === run.appId
|
|
24
|
+
&& planned.workflowId === run.workflowId
|
|
25
|
+
&& planned.runAt.getTime() === run.runAt.getTime());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export { InMemoryJobRunSchedulePersistence };
|
|
29
|
+
//# sourceMappingURL=InMemoryJobRunSchedulePersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryJobRunSchedulePersistence.js","sourceRoot":"","sources":["../../src/scheduling/InMemoryJobRunSchedulePersistence.ts"],"names":[],"mappings":"AAIA,MAAM,iCAAiC;IAE3B,IAAI,GAAuB,EAAE,CAAC;IAEtC,KAAK,CAAC,aAAa,CAAC,KAAc,EAAE,UAAmB;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;aAClB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,UAAU,KAAK,UAAU,CAAC;aACnE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAA0B;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAS;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,KAAK,MAAM,GAAG,IAAI,GAAG;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IAEO,cAAc,CAAC,GAAkB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC5B,OAAO,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;eACxB,OAAO,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;eACrC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;CAEJ;AAED,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobRunSchedulePersistenceFactory.d.ts","sourceRoot":"","sources":["../../src/scheduling/JobRunSchedulePersistenceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,yBAAyB,EAAC,MAAM,eAAe,CAAC;AAIxD,QAAA,MAAM,gCAAgC;IAClC,QAAQ,IAAK,yBAAyB;CASzC,CAAA;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CloudJobRunSchedulePersistence } from "anbaric-impl-cloud";
|
|
2
|
+
import { InMemoryJobRunSchedulePersistence } from "./InMemoryJobRunSchedulePersistence.js";
|
|
3
|
+
const JobRunSchedulePersistenceFactory = {
|
|
4
|
+
instance() {
|
|
5
|
+
switch (process.env.ANBARIC_JOB_RUN_SCHEDULE_PERSISTENCE_TYPE) {
|
|
6
|
+
case "cloud":
|
|
7
|
+
return new CloudJobRunSchedulePersistence();
|
|
8
|
+
case "memory":
|
|
9
|
+
default:
|
|
10
|
+
return new InMemoryJobRunSchedulePersistence();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export { JobRunSchedulePersistenceFactory };
|
|
15
|
+
//# sourceMappingURL=JobRunSchedulePersistenceFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobRunSchedulePersistenceFactory.js","sourceRoot":"","sources":["../../src/scheduling/JobRunSchedulePersistenceFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,8BAA8B,EAAC,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAC,iCAAiC,EAAC,MAAM,wCAAwC,CAAC;AAEzF,MAAM,gCAAgC,GAAG;IACrC,QAAQ;QACJ,QAAQ,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,CAAC;YAC5D,KAAK,OAAO;gBACR,OAAO,IAAI,8BAA8B,EAAE,CAAC;YAChD,KAAK,QAAQ,CAAC;YACd;gBACI,OAAO,IAAI,iCAAiC,EAAE,CAAC;QACvD,CAAC;IACL,CAAC;CACJ,CAAA;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { JobRunSchedulePersistence } from "anbaric-tsapi";
|
|
2
|
+
import { StateMachine } from "../StateMachine.js";
|
|
3
|
+
import { Schedule } from "./Schedule.js";
|
|
4
|
+
declare class JobRunScheduler {
|
|
5
|
+
private persistence;
|
|
6
|
+
private static singleton?;
|
|
7
|
+
private machines;
|
|
8
|
+
private ticker?;
|
|
9
|
+
private ticking;
|
|
10
|
+
constructor(persistence?: JobRunSchedulePersistence);
|
|
11
|
+
static instance(): JobRunScheduler;
|
|
12
|
+
schedule(machine: StateMachine, at: Schedule, lookaheadMs?: number, randomRunOffsetMs?: [number, number]): void;
|
|
13
|
+
tick(now?: Date): Promise<void>;
|
|
14
|
+
cleanUp(): Promise<void>;
|
|
15
|
+
private start;
|
|
16
|
+
private tickOnce;
|
|
17
|
+
private planAhead;
|
|
18
|
+
private startDue;
|
|
19
|
+
private withOffset;
|
|
20
|
+
private propertiesFor;
|
|
21
|
+
private key;
|
|
22
|
+
}
|
|
23
|
+
export { JobRunScheduler };
|
|
24
|
+
//# sourceMappingURL=JobRunScheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobRunScheduler.d.ts","sourceRoot":"","sources":["../../src/scheduling/JobRunScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,yBAAyB,EAAe,MAAM,eAAe,CAAC;AACtE,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAuBvC,cAAM,eAAe;IAQL,OAAO,CAAC,WAAW;IAN/B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAmB;IAE5C,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAS;IAExB,YAAoB,WAAW,GAAG,yBAAuE,EAAI;IAE7G,MAAM,CAAC,QAAQ,IAAK,eAAe,CAGlC;IAED,QAAQ,CAAC,OAAO,EAAG,YAAY,EAAE,EAAE,EAAG,QAAQ,EAAE,WAAW,GAAG,MAA6B,EAAE,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAyB,GAAI,IAAI,CAIhK;IAGK,IAAI,CAAC,GAAG,GAAG,IAAiB,GAAI,OAAO,CAAC,IAAI,CAAC,CAGlD;IAEK,OAAO,IAAK,OAAO,CAAC,IAAI,CAAC,CAI9B;IAED,OAAO,CAAC,KAAK;YAOC,QAAQ;YAYR,SAAS;YAkBT,QAAQ;IAWtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,GAAG;CAId;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { JobRunSchedulePersistenceFactory } from "./JobRunSchedulePersistenceFactory.js";
|
|
2
|
+
const TICK_INTERVAL_MS = 1000;
|
|
3
|
+
const DEFAULT_LOOKAHEAD_MS = 1000 * 60 * 60 * 24;
|
|
4
|
+
const DEFAULT_RUN_OFFSET_MS = [0, 1000 * 60 * 2];
|
|
5
|
+
/* Starts jobs on a timetable. Runs are planned ahead of time and stored, so
|
|
6
|
+
the plan survives a restart and a machine that was down does not silently
|
|
7
|
+
skip its runs; each tick plans further ahead and starts whatever has come
|
|
8
|
+
due. Planning and starting are separate on purpose - a run is a record long
|
|
9
|
+
before it is a job.
|
|
10
|
+
|
|
11
|
+
How safely two schedulers can share a plan is the persistence's business:
|
|
12
|
+
the in-memory one claims within a single process, while the platform-backed
|
|
13
|
+
one claims atomically, so a deployed app can run several instances and each
|
|
14
|
+
due run still starts exactly once. */
|
|
15
|
+
class JobRunScheduler {
|
|
16
|
+
persistence;
|
|
17
|
+
static singleton;
|
|
18
|
+
machines = new Map();
|
|
19
|
+
ticker;
|
|
20
|
+
ticking = false;
|
|
21
|
+
constructor(persistence = JobRunSchedulePersistenceFactory.instance()) {
|
|
22
|
+
this.persistence = persistence;
|
|
23
|
+
}
|
|
24
|
+
static instance() {
|
|
25
|
+
if (!JobRunScheduler.singleton)
|
|
26
|
+
JobRunScheduler.singleton = new JobRunScheduler();
|
|
27
|
+
return JobRunScheduler.singleton;
|
|
28
|
+
}
|
|
29
|
+
schedule(machine, at, lookaheadMs = DEFAULT_LOOKAHEAD_MS, randomRunOffsetMs = DEFAULT_RUN_OFFSET_MS) {
|
|
30
|
+
this.machines.set(this.key(machine.getAppId(), machine.workflowId), { machine, schedule: at, lookaheadMs, randomRunOffsetMs });
|
|
31
|
+
this.start();
|
|
32
|
+
}
|
|
33
|
+
// Plans and starts everything owed as at `now`, without waiting for a tick.
|
|
34
|
+
async tick(now = new Date()) {
|
|
35
|
+
for (const scheduled of this.machines.values())
|
|
36
|
+
await this.planAhead(scheduled, now);
|
|
37
|
+
await this.startDue(now);
|
|
38
|
+
}
|
|
39
|
+
async cleanUp() {
|
|
40
|
+
if (this.ticker)
|
|
41
|
+
clearInterval(this.ticker);
|
|
42
|
+
this.ticker = undefined;
|
|
43
|
+
this.machines.clear();
|
|
44
|
+
}
|
|
45
|
+
start() {
|
|
46
|
+
if (this.ticker)
|
|
47
|
+
return;
|
|
48
|
+
this.ticker = setInterval(() => void this.tickOnce(), TICK_INTERVAL_MS);
|
|
49
|
+
// Scheduling alone should not hold a process open.
|
|
50
|
+
this.ticker.unref?.();
|
|
51
|
+
}
|
|
52
|
+
async tickOnce() {
|
|
53
|
+
if (this.ticking)
|
|
54
|
+
return;
|
|
55
|
+
this.ticking = true;
|
|
56
|
+
try {
|
|
57
|
+
await this.tick();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// A failing tick must not kill the timer; the next one retries.
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
this.ticking = false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async planAhead(scheduled, now) {
|
|
67
|
+
const appId = scheduled.machine.getAppId();
|
|
68
|
+
const workflowId = scheduled.machine.workflowId;
|
|
69
|
+
const planned = await this.persistence.highWaterMark(appId, workflowId);
|
|
70
|
+
const from = planned && planned.getTime() > now.getTime() ? planned : now;
|
|
71
|
+
const to = new Date(now.getTime() + scheduled.lookaheadMs);
|
|
72
|
+
if (to.getTime() <= from.getTime())
|
|
73
|
+
return;
|
|
74
|
+
const runs = scheduled.schedule.getRuns(from, to).map(runAt => ({
|
|
75
|
+
appId,
|
|
76
|
+
workflowId,
|
|
77
|
+
runAt: this.withOffset(runAt, scheduled.randomRunOffsetMs),
|
|
78
|
+
}));
|
|
79
|
+
if (runs.length > 0)
|
|
80
|
+
await this.persistence.plan(runs);
|
|
81
|
+
}
|
|
82
|
+
async startDue(now) {
|
|
83
|
+
for (const run of await this.persistence.claimDue(now)) {
|
|
84
|
+
const scheduled = this.machines.get(this.key(run.appId, run.workflowId));
|
|
85
|
+
if (!scheduled)
|
|
86
|
+
continue;
|
|
87
|
+
await scheduled.machine.startJob(this.propertiesFor(run));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Spreads runs that would otherwise all fire on the same second. Applied
|
|
91
|
+
// when the run is planned, not when it starts, so the time that was stored
|
|
92
|
+
// is the time it actually runs.
|
|
93
|
+
withOffset(runAt, [lowest, highest]) {
|
|
94
|
+
if (highest <= lowest)
|
|
95
|
+
return runAt;
|
|
96
|
+
return new Date(runAt.getTime() + Math.round(Math.random() * (highest - lowest)) + lowest);
|
|
97
|
+
}
|
|
98
|
+
propertiesFor(run) {
|
|
99
|
+
return new Map([["scheduledFor", run.runAt.toISOString()]]);
|
|
100
|
+
}
|
|
101
|
+
key(appId, workflowId) {
|
|
102
|
+
return JSON.stringify([appId, workflowId]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export { JobRunScheduler };
|
|
106
|
+
//# sourceMappingURL=JobRunScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobRunScheduler.js","sourceRoot":"","sources":["../../src/scheduling/JobRunScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type TimeOfDay = {
|
|
2
|
+
hours: number;
|
|
3
|
+
minutes: number;
|
|
4
|
+
};
|
|
5
|
+
declare class Schedule {
|
|
6
|
+
private dayTest;
|
|
7
|
+
private times;
|
|
8
|
+
constructor(dayTest: (date: Date) => boolean, times: Array<TimeOfDay>);
|
|
9
|
+
getRuns(from: Date, to: Date): Array<Date>;
|
|
10
|
+
static daysOfWeek(days: Array<number>): (date: Date) => boolean;
|
|
11
|
+
static daysOfMonth(days: Array<number>): (date: Date) => boolean;
|
|
12
|
+
static everyDay(): (_date: Date) => boolean;
|
|
13
|
+
}
|
|
14
|
+
export { Schedule };
|
|
15
|
+
export type { TimeOfDay };
|
|
16
|
+
//# sourceMappingURL=Schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schedule.d.ts","sourceRoot":"","sources":["../../src/scheduling/Schedule.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG;IAAE,KAAK,EAAG,MAAM,CAAC;IAAC,OAAO,EAAG,MAAM,CAAA;CAAE,CAAC;AAKtD,cAAM,QAAQ;IAEE,OAAO,CAAC,OAAO;IAA6B,OAAO,CAAC,KAAK;IAArE,YAAoB,OAAO,EAAG,CAAC,IAAI,EAAG,IAAI,KAAK,OAAO,EAAU,KAAK,EAAG,KAAK,CAAC,SAAS,CAAC,EAAI;IAG5F,OAAO,CAAC,IAAI,EAAG,IAAI,EAAE,EAAE,EAAG,IAAI,GAAI,KAAK,CAAC,IAAI,CAAC,CAiB5C;IAED,MAAM,CAAC,UAAU,CAAC,IAAI,EAAG,KAAK,CAAC,MAAM,CAAC,UACnB,IAAI,aACtB;IAED,MAAM,CAAC,WAAW,CAAC,IAAI,EAAG,KAAK,CAAC,MAAM,CAAC,UACpB,IAAI,aACtB;IAED,MAAM,CAAC,QAAQ,YACK,IAAI,aACvB;CAEJ;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Which days a machine runs on and at what times. The day test and the times
|
|
2
|
+
are separate so "weekdays at 09:00 and 17:00" and "the 1st of the month at
|
|
3
|
+
midnight" are the same shape. */
|
|
4
|
+
class Schedule {
|
|
5
|
+
dayTest;
|
|
6
|
+
times;
|
|
7
|
+
constructor(dayTest, times) {
|
|
8
|
+
this.dayTest = dayTest;
|
|
9
|
+
this.times = times;
|
|
10
|
+
}
|
|
11
|
+
// Runs strictly after `from` and up to and including `to`, in order.
|
|
12
|
+
getRuns(from, to) {
|
|
13
|
+
const runs = [];
|
|
14
|
+
const day = new Date(from);
|
|
15
|
+
day.setHours(0, 0, 0, 0);
|
|
16
|
+
for (; day.getTime() <= to.getTime(); day.setDate(day.getDate() + 1)) {
|
|
17
|
+
if (!this.dayTest(day))
|
|
18
|
+
continue;
|
|
19
|
+
for (const time of this.times) {
|
|
20
|
+
const run = new Date(day);
|
|
21
|
+
run.setHours(time.hours, time.minutes, 0, 0);
|
|
22
|
+
if (run.getTime() > from.getTime() && run.getTime() <= to.getTime())
|
|
23
|
+
runs.push(run);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return runs.sort((left, right) => left.getTime() - right.getTime());
|
|
27
|
+
}
|
|
28
|
+
static daysOfWeek(days) {
|
|
29
|
+
return (date) => days.includes(date.getDay());
|
|
30
|
+
}
|
|
31
|
+
static daysOfMonth(days) {
|
|
32
|
+
return (date) => days.includes(date.getDate());
|
|
33
|
+
}
|
|
34
|
+
static everyDay() {
|
|
35
|
+
return (_date) => true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export { Schedule };
|
|
39
|
+
//# sourceMappingURL=Schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schedule.js","sourceRoot":"","sources":["../../src/scheduling/Schedule.ts"],"names":[],"mappings":"AAEA;;mCAEmC;AACnC,MAAM,QAAQ;IAEU,OAAO;IAAqC,KAAK;IAArE,YAAoB,OAAkC,EAAU,KAAwB;uBAApE,OAAO;qBAAqC,KAAK;IAAsB,CAAC;IAE5F,qEAAqE;IACrE,OAAO,CAAC,IAAW,EAAE,EAAS;QAC1B,MAAM,IAAI,GAAiB,EAAE,CAAC;QAE9B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzB,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,SAAS;YAEjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7C,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAAoB;QAClC,OAAO,CAAC,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAoB;QACnC,OAAO,CAAC,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,OAAO,CAAC,KAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAClC,CAAC;CAEJ;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anbaric-state-machine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.25.0",
|
|
4
4
|
"description": "This is the state machine library that one can use to add state management to an application. It will, by default, be locally runnable but can deployed to the Anbaric Cloud via the CLI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "chris@anbaric.ai",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"typescript": "^7.0.2"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"anbaric-impl-cloud": "^1.
|
|
28
|
-
"anbaric-tsapi": "^1.
|
|
27
|
+
"anbaric-impl-cloud": "^1.25.0",
|
|
28
|
+
"anbaric-tsapi": "^1.25.0"
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
31
|
"dist"
|