@toa.io/extensions.cadence 1.0.0-alpha.314 → 1.0.0-alpha.315
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Written by `toa types`. Every run rewrites it.
|
|
2
2
|
// What a manifest does not state belongs in a file of your own.
|
|
3
3
|
|
|
4
|
-
import type {
|
|
4
|
+
import type { Query } from '@toa.io/core/types'
|
|
5
5
|
import type { Readable } from 'node:stream'
|
|
6
6
|
|
|
7
7
|
export interface Entity {
|
|
@@ -38,12 +38,12 @@ export type DelayInput = {
|
|
|
38
38
|
export type DelayOutput = string
|
|
39
39
|
|
|
40
40
|
export interface Component {
|
|
41
|
-
delay: (request: { input: DelayInput, task?: boolean }
|
|
42
|
-
settle: (request: { input?: null, query: Query<Entity>, task?: boolean }
|
|
43
|
-
assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
44
|
-
ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
45
|
-
enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
46
|
-
observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
47
|
-
stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
48
|
-
terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }
|
|
41
|
+
delay: (request: { input: DelayInput, task?: boolean }) => Promise<DelayOutput>
|
|
42
|
+
settle: (request: { input?: null, query: Query<Entity>, task?: boolean }) => Promise<unknown>
|
|
43
|
+
assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
|
|
44
|
+
ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
|
|
45
|
+
enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
|
|
46
|
+
observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
|
|
47
|
+
stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
|
|
48
|
+
terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
|
|
49
49
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toa.io/extensions.cadence",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.315",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Toa Schedule",
|
|
6
6
|
"author": "temich <tema.gurtovoy@gmail.com>",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"!**/.env*"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@toa.io/core": "1.0.0-alpha.
|
|
30
|
-
"@toa.io/definitions": "1.0.0-alpha.
|
|
29
|
+
"@toa.io/core": "1.0.0-alpha.315",
|
|
30
|
+
"@toa.io/definitions": "1.0.0-alpha.315",
|
|
31
31
|
"@toa.io/generic": "1.0.0-alpha.311",
|
|
32
32
|
"@toa.io/schemas": "1.0.0-alpha.311",
|
|
33
33
|
"openspan": "1.0.0-alpha.305"
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"scripts": {
|
|
36
36
|
"transpile": "tsc"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "d88ed286bf44bf95b5f3d9db6e7d4621261dbb99"
|
|
39
39
|
}
|
package/readme.md
CHANGED
|
@@ -5,9 +5,11 @@ Calls a component makes to itself, and calls it puts off.
|
|
|
5
5
|
A **pulse** calls an operation of its own component on a cadence its manifest states. A **delay**
|
|
6
6
|
hands one call over to be made later.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
at all.
|
|
8
|
+
A delay, and a pulse that is the component's rather than each replica's, rest on
|
|
9
|
+
[`atomicity`](/connectors/atomicity), which is what keeps two replicas from making one call and
|
|
10
|
+
where that promise is written down. Where it is not configured, neither is made at all. A pulse
|
|
11
|
+
declared [`scope: replica`](#in-one-replica-or-in-every-one) asks nothing of it and is made
|
|
12
|
+
either way.
|
|
11
13
|
|
|
12
14
|
## Pulse
|
|
13
15
|
|
|
@@ -49,6 +51,32 @@ midnight and `3600` the top of the hour. A cycle that is not a divisor of a day
|
|
|
49
51
|
boundary that is not any particular time of day. Time zones and calendar months are not
|
|
50
52
|
supported.
|
|
51
53
|
|
|
54
|
+
### In one replica, or in every one
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
# manifest.toa.yaml
|
|
58
|
+
cadence:
|
|
59
|
+
trim:
|
|
60
|
+
cycle: 60
|
|
61
|
+
scope: replica # every replica, for what lives in a process
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`scope` says whose work this is. It defaults to `group`: the work is the component's, the replicas
|
|
65
|
+
agree on which of them makes each call, and one of them does. That is what work over shared state
|
|
66
|
+
wants — a collection to sweep, a reconciliation, a report — and the whole of it is done once
|
|
67
|
+
however many replicas are running.
|
|
68
|
+
|
|
69
|
+
`scope: replica` makes the call in every replica. A cache, a buffer, a pool, a file a process
|
|
70
|
+
wrote in its own container: each replica holds its own and has to look after its own, and nothing
|
|
71
|
+
else can do it for it. Such a pulse asks nothing of `atomicity`, so it is made where a `group`
|
|
72
|
+
pulse would make no call at all.
|
|
73
|
+
|
|
74
|
+
`intervals` means the same under both: the cycle is split over _time_. Under `replica` every
|
|
75
|
+
replica walks the whole of the split, so `intervals: 24` with a daily cycle is each replica doing
|
|
76
|
+
a twenty-fourth of its own work every hour.
|
|
77
|
+
|
|
78
|
+
An operation called this way runs in the replica that called it.
|
|
79
|
+
|
|
52
80
|
### What to expect
|
|
53
81
|
|
|
54
82
|
**An interval may not be called.** A rollout, a crash, or an operation that raised or ran past
|
|
@@ -65,7 +93,13 @@ schedule: [`delay`](#delay) is one.
|
|
|
65
93
|
|
|
66
94
|
**An interval is called once.** Two calls for one interval need the clocks of two machines to
|
|
67
95
|
disagree and the work to change hands in the same moment, which is a window the width of that
|
|
68
|
-
disagreement.
|
|
96
|
+
disagreement. Under `scope: replica` it is called once _per replica_, and while a rollout has the
|
|
97
|
+
old replicas and the new ones up together, that is more calls than either count.
|
|
98
|
+
|
|
99
|
+
**Nothing spaces out what `scope: replica` makes.** Every replica calls at the same boundary, by
|
|
100
|
+
the same clock, and nothing arranges them — so an operation that reaches past its own process, to
|
|
101
|
+
a database or an API, reaches it as many times at once as there are replicas. Work that is
|
|
102
|
+
anything but the process's own belongs in a `group` pulse.
|
|
69
103
|
|
|
70
104
|
**A call is never made while the one before it is still running.** If the work does not fit the
|
|
71
105
|
gap the interval is skipped and says so; where that is logged, the cycle is too short or has too
|
|
@@ -78,7 +112,8 @@ picking one.
|
|
|
78
112
|
|
|
79
113
|
`intervals` is not a replica count. With `intervals: 24` and three replicas each makes eight of
|
|
80
114
|
the day's calls: the cycle is spread over _time_, not over the fleet. Replicas beyond `intervals`
|
|
81
|
-
make none.
|
|
115
|
+
make none. How much of the fleet calls is what [`scope`](#in-one-replica-or-in-every-one) says,
|
|
116
|
+
and it is the only thing that says it.
|
|
82
117
|
|
|
83
118
|
## Delay
|
|
84
119
|
|
package/transpiled/Factory.js
CHANGED
|
@@ -28,9 +28,14 @@ export class Factory {
|
|
|
28
28
|
if (pulses === null)
|
|
29
29
|
return tenant;
|
|
30
30
|
const local = this.local(locator);
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const entries = Object.entries(pulses);
|
|
32
|
+
// a pulse every replica makes asks nobody whether it may, so a component whose pulses are
|
|
33
|
+
// all of that kind decides nothing with its replicas and needs no atom at all
|
|
34
|
+
const atom = entries.some(([, pulse]) => pulse.scope === 'group')
|
|
35
|
+
? this.host.atom(locator.id)
|
|
36
|
+
: undefined;
|
|
37
|
+
for (const [endpoint, { cycle, intervals, scope }] of entries)
|
|
38
|
+
tenant.depends(new Pulse({ locator, endpoint, cycle, intervals }, local, scope === 'group' ? atom : undefined));
|
|
34
39
|
return tenant;
|
|
35
40
|
}
|
|
36
41
|
/** `context.delay` — for every component but the one that keeps the calls. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIlC,MAAM,OAAO,OAAO;IACD,IAAI,CAAM;IAE3B,yEAAyE;IACxD,MAAM,GAA0B,EAAE,CAAA;IAEnD,YAAmB,IAAU;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,OAAgB,EAAE,WAAmB;QACjD,IAAI,IAAI,CAAC,OAAO,CAAC;YACf,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,SAAS,EAAE,EAChB,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAC3B,CAAA;QAEH,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAA;QAC9B,MAAM,MAAM,GAAG,WAAiC,CAAA;QAEhD,qDAAqD;QACrD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAA;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":"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"}
|
package/transpiled/Pulse.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ import type { atomicity } from '@toa.io/core/types';
|
|
|
10
10
|
* owns `i` is the one that calls. An interval no replica was alive for is not made up
|
|
11
11
|
* afterwards — the operation is expected to select by what is still due rather than by where
|
|
12
12
|
* the cycle has reached.
|
|
13
|
+
*
|
|
14
|
+
* Who owns an interval is what an `atom` says, and a pulse built with none is one every replica
|
|
15
|
+
* makes: work that lives inside a process — a cache, a buffer, a file it wrote — is each
|
|
16
|
+
* process's own, and there is nothing there for two replicas to divide.
|
|
13
17
|
*/
|
|
14
18
|
export declare class Pulse extends Connector {
|
|
15
19
|
private readonly endpoint;
|
|
@@ -19,7 +23,8 @@ export declare class Pulse extends Connector {
|
|
|
19
23
|
/** intervals the cycle is split into */
|
|
20
24
|
private readonly n;
|
|
21
25
|
private readonly local;
|
|
22
|
-
|
|
26
|
+
/** what says which intervals are this replica's; absent where every replica makes the call */
|
|
27
|
+
private readonly atom?;
|
|
23
28
|
/** span options, built once */
|
|
24
29
|
private readonly options;
|
|
25
30
|
/**
|
|
@@ -34,7 +39,7 @@ export declare class Pulse extends Connector {
|
|
|
34
39
|
private closing;
|
|
35
40
|
/** Whether the process has been told to go quiet, see `stop`. */
|
|
36
41
|
private quiesced;
|
|
37
|
-
constructor(definition: Definition, local: Local, atom
|
|
42
|
+
constructor(definition: Definition, local: Local, atom?: atomicity.Atom);
|
|
38
43
|
/**
|
|
39
44
|
* How many intervals have passed since the epoch, `now` included. Against the cycle rather
|
|
40
45
|
* than by adding up gaps, so a cycle that does not divide evenly into its intervals neither
|
package/transpiled/Pulse.js
CHANGED
|
@@ -9,6 +9,10 @@ import { Connector } from '@toa.io/core';
|
|
|
9
9
|
* owns `i` is the one that calls. An interval no replica was alive for is not made up
|
|
10
10
|
* afterwards — the operation is expected to select by what is still due rather than by where
|
|
11
11
|
* the cycle has reached.
|
|
12
|
+
*
|
|
13
|
+
* Who owns an interval is what an `atom` says, and a pulse built with none is one every replica
|
|
14
|
+
* makes: work that lives inside a process — a cache, a buffer, a file it wrote — is each
|
|
15
|
+
* process's own, and there is nothing there for two replicas to divide.
|
|
12
16
|
*/
|
|
13
17
|
export class Pulse extends Connector {
|
|
14
18
|
endpoint;
|
|
@@ -18,6 +22,7 @@ export class Pulse extends Connector {
|
|
|
18
22
|
/** intervals the cycle is split into */
|
|
19
23
|
n;
|
|
20
24
|
local;
|
|
25
|
+
/** what says which intervals are this replica's; absent where every replica makes the call */
|
|
21
26
|
atom;
|
|
22
27
|
/** span options, built once */
|
|
23
28
|
options;
|
|
@@ -43,7 +48,8 @@ export class Pulse extends Connector {
|
|
|
43
48
|
this.local = local;
|
|
44
49
|
this.atom = atom;
|
|
45
50
|
this.depends(local);
|
|
46
|
-
|
|
51
|
+
if (atom !== undefined)
|
|
52
|
+
this.depends(atom);
|
|
47
53
|
this.options = {
|
|
48
54
|
name: `${this.label} pulse`,
|
|
49
55
|
kind: 'producer',
|
|
@@ -139,17 +145,20 @@ export class Pulse extends Connector {
|
|
|
139
145
|
});
|
|
140
146
|
return;
|
|
141
147
|
}
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
// with nobody to ask, every interval is this replica's own
|
|
149
|
+
if (this.atom !== undefined) {
|
|
150
|
+
const owned = this.atom.slots(this.n);
|
|
151
|
+
if (owned === null) {
|
|
152
|
+
measure.missed(this.label, 'unowned');
|
|
153
|
+
console.warn('Pulse skipped: this replica owns nothing', {
|
|
154
|
+
pulse: this.label,
|
|
155
|
+
interval: i
|
|
156
|
+
});
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!owned.includes(i))
|
|
160
|
+
return;
|
|
150
161
|
}
|
|
151
|
-
if (!owned.includes(i))
|
|
152
|
-
return;
|
|
153
162
|
measure.fired(this.label);
|
|
154
163
|
/*
|
|
155
164
|
* A pulse calls and waits, so an operation that raised comes back as an exception here —
|
package/transpiled/Pulse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pulse.js","sourceRoot":"","sources":["../source/Pulse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAMxC
|
|
1
|
+
{"version":3,"file":"Pulse.js","sourceRoot":"","sources":["../source/Pulse.ts"],"names":[],"mappings":"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"}
|