@aeolus-fleet/core 0.24.1 → 0.25.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/README.md +5 -5
- package/dist/adapters/prisma/generated/browser.d.ts +15 -5
- package/dist/adapters/prisma/generated/client.d.ts +15 -5
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +60 -0
- package/dist/adapters/prisma/generated/enums.d.ts +15 -1
- package/dist/adapters/prisma/generated/enums.js +13 -1
- package/dist/adapters/prisma/generated/enums.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/class.d.ts +11 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +109 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +16 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +17 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +16 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +3 -2
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +304 -4
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +267 -0
- package/dist/adapters/prisma/generated/models/Lease.d.ts +332 -1
- package/dist/adapters/prisma/generated/models/OverdueDelivery.d.ts +1687 -0
- package/dist/adapters/prisma/generated/models/OverdueDelivery.js +2 -0
- package/dist/adapters/prisma/generated/models/OverdueDelivery.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +271 -0
- package/dist/adapters/prisma/generated/models.d.ts +1 -0
- package/dist/adapters/prisma/history.js +231 -46
- package/dist/adapters/prisma/history.js.map +1 -1
- package/dist/adapters/prisma/installation.js +30 -1
- package/dist/adapters/prisma/installation.js.map +1 -1
- package/dist/adapters/prisma/messaging.js +11 -7
- package/dist/adapters/prisma/messaging.js.map +1 -1
- package/dist/adapters/prisma/overdue.d.ts +4 -0
- package/dist/adapters/prisma/overdue.js +63 -0
- package/dist/adapters/prisma/overdue.js.map +1 -0
- package/dist/adapters/prisma/registry.js +32 -7
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/rows.d.ts +12 -1
- package/dist/adapters/prisma/rows.js +46 -1
- package/dist/adapters/prisma/rows.js.map +1 -1
- package/dist/adapters/prisma/unit-of-work.d.ts +2 -1
- package/dist/adapters/prisma/unit-of-work.js +2 -0
- package/dist/adapters/prisma/unit-of-work.js.map +1 -1
- package/dist/adapters/trpc/context.d.ts +16 -0
- package/dist/adapters/trpc/fleet.d.ts +233 -15
- package/dist/adapters/trpc/fleet.js +52 -8
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/installation.d.ts +14 -0
- package/dist/adapters/trpc/installation.js +7 -1
- package/dist/adapters/trpc/installation.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +301 -9
- package/dist/adapters/trpc/ship-protocol.js +2 -2
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/ship.d.ts +87 -0
- package/dist/adapters/trpc/ship.js +96 -1
- package/dist/adapters/trpc/ship.js.map +1 -1
- package/dist/adapters/trpc/starting-prompt-text.d.ts +1 -1
- package/dist/adapters/trpc/starting-prompt-text.js +22 -25
- package/dist/adapters/trpc/starting-prompt-text.js.map +1 -1
- package/dist/adapters/trpc/trpc.js +5 -0
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/app.d.ts +4 -2
- package/dist/app.js +21 -9
- package/dist/app.js.map +1 -1
- package/dist/domain/messaging/delivery.d.ts +88 -28
- package/dist/domain/messaging/delivery.js +213 -39
- package/dist/domain/messaging/delivery.js.map +1 -1
- package/dist/domain/messaging/dismiss-delivery.d.ts +1 -1
- package/dist/domain/messaging/dismiss-delivery.js +1 -1
- package/dist/domain/messaging/hand-over-delivery.d.ts +38 -0
- package/dist/domain/messaging/hand-over-delivery.js +46 -0
- package/dist/domain/messaging/hand-over-delivery.js.map +1 -0
- package/dist/domain/messaging/message.d.ts +12 -1
- package/dist/domain/messaging/message.js +2 -0
- package/dist/domain/messaging/message.js.map +1 -1
- package/dist/domain/messaging/overdue.d.ts +60 -0
- package/dist/domain/messaging/overdue.js +52 -0
- package/dist/domain/messaging/overdue.js.map +1 -0
- package/dist/domain/messaging/ports.d.ts +20 -0
- package/dist/domain/messaging/public.d.ts +1 -0
- package/dist/domain/messaging/public.js +2 -0
- package/dist/domain/messaging/public.js.map +1 -0
- package/dist/domain/messaging/push-receive-deliveries.d.ts +48 -0
- package/dist/domain/messaging/push-receive-deliveries.js +70 -0
- package/dist/domain/messaging/push-receive-deliveries.js.map +1 -0
- package/dist/domain/messaging/receive-deliveries.d.ts +39 -6
- package/dist/domain/messaging/receive-deliveries.js +80 -50
- package/dist/domain/messaging/receive-deliveries.js.map +1 -1
- package/dist/domain/messaging/report-handled.d.ts +22 -0
- package/dist/domain/messaging/report-handled.js +13 -0
- package/dist/domain/messaging/report-handled.js.map +1 -0
- package/dist/domain/messaging/report-not-handled.d.ts +22 -0
- package/dist/domain/messaging/report-not-handled.js +13 -0
- package/dist/domain/messaging/report-not-handled.js.map +1 -0
- package/dist/domain/messaging/report-turn-end.d.ts +29 -0
- package/dist/domain/messaging/report-turn-end.js +36 -0
- package/dist/domain/messaging/report-turn-end.js.map +1 -0
- package/dist/domain/messaging/resend-delivery.d.ts +1 -1
- package/dist/domain/messaging/resend-delivery.js +1 -1
- package/dist/domain/messaging/tell-overdue-deliveries.d.ts +25 -0
- package/dist/domain/messaging/tell-overdue-deliveries.js +30 -0
- package/dist/domain/messaging/tell-overdue-deliveries.js.map +1 -0
- package/dist/domain/registry/crew-request.d.ts +12 -6
- package/dist/domain/registry/crew-request.js +21 -3
- package/dist/domain/registry/crew-request.js.map +1 -1
- package/dist/domain/registry/installation-fleet.d.ts +3 -2
- package/dist/domain/registry/installation-fleet.js.map +1 -1
- package/dist/domain/registry/leases.d.ts +26 -0
- package/dist/domain/registry/leases.js +26 -1
- package/dist/domain/registry/leases.js.map +1 -1
- package/dist/domain/registry/ping-status.d.ts +2 -2
- package/dist/domain/registry/ping-status.js +7 -4
- package/dist/domain/registry/ping-status.js.map +1 -1
- package/dist/domain/registry/ports.d.ts +40 -0
- package/dist/domain/registry/public.d.ts +2 -2
- package/dist/domain/registry/public.js +1 -1
- package/dist/domain/registry/public.js.map +1 -1
- package/dist/domain/registry/report-turn.d.ts +28 -0
- package/dist/domain/registry/report-turn.js +28 -0
- package/dist/domain/registry/report-turn.js.map +1 -0
- package/dist/domain/registry/request-crew.d.ts +6 -2
- package/dist/domain/registry/request-crew.js +14 -3
- package/dist/domain/registry/request-crew.js.map +1 -1
- package/dist/domain/registry/turn.d.ts +25 -0
- package/dist/domain/registry/turn.js +30 -0
- package/dist/domain/registry/turn.js.map +1 -0
- package/dist/domain/shared/delivery-way.d.ts +83 -0
- package/dist/domain/shared/delivery-way.js +89 -0
- package/dist/domain/shared/delivery-way.js.map +1 -0
- package/dist/domain/shared/errors.d.ts +1 -1
- package/dist/domain/shared/errors.js.map +1 -1
- package/dist/domain/shared/history.d.ts +116 -19
- package/dist/domain/shared/history.js +1 -1
- package/dist/domain/shared/history.js.map +1 -1
- package/dist/domain/shared/read-message.d.ts +7 -3
- package/dist/domain/shared/read-message.js +7 -4
- package/dist/domain/shared/read-message.js.map +1 -1
- package/dist/domain/shared/read-needs-attention.d.ts +5 -5
- package/dist/domain/shared/read-needs-attention.js +4 -4
- package/dist/domain/shared/read-needs-attention.js.map +1 -1
- package/dist/domain/shared/read-no-ship-can-take.d.ts +13 -0
- package/dist/domain/shared/read-no-ship-can-take.js +12 -0
- package/dist/domain/shared/read-no-ship-can-take.js.map +1 -0
- package/dist/domain/shared/read-overdue.d.ts +13 -0
- package/dist/domain/shared/read-overdue.js +12 -0
- package/dist/domain/shared/read-overdue.js.map +1 -0
- package/dist/domain/shared/read-ship-messages.d.ts +4 -1
- package/dist/domain/shared/read-ship-messages.js +6 -1
- package/dist/domain/shared/read-ship-messages.js.map +1 -1
- package/dist/domain/shared/read-ship-way.d.ts +41 -0
- package/dist/domain/shared/read-ship-way.js +39 -0
- package/dist/domain/shared/read-ship-way.js.map +1 -0
- package/dist/repeating-pass.d.ts +15 -0
- package/dist/repeating-pass.js +31 -0
- package/dist/repeating-pass.js.map +1 -0
- package/dist/wiring.d.ts +19 -0
- package/dist/wiring.js +25 -0
- package/dist/wiring.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/prisma/migrations/20261012190000_delivery_handed/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261012210000_push_receive/migration.sql +7 -0
- package/src/adapters/prisma/migrations/20261013090000_handled/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261013100000_turn/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261013120000_overdue/migration.sql +28 -0
- package/src/adapters/prisma/migrations/20261013140000_delivery_state_index/migration.sql +4 -0
- package/src/adapters/prisma/schema.prisma +69 -6
|
@@ -4,25 +4,25 @@ import { shipActor } from '../shared/events.js';
|
|
|
4
4
|
import { ok } from '../shared/result.js';
|
|
5
5
|
/**
|
|
6
6
|
* The Delivery's rules once it is stored (docs/blueprint.md, "Key flows"): a
|
|
7
|
-
* receive
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* plain receive hands it over at once, a push receive takes it for the
|
|
8
|
+
* computer side to hand over, the ship it was handed to acknowledges it,
|
|
9
|
+
* and a delivery that keeps being handed over without an acknowledgement
|
|
10
|
+
* stops, undeliverable, where the operator sees it.
|
|
10
11
|
*/
|
|
11
12
|
/**
|
|
12
|
-
* The
|
|
13
|
-
* instead of being handed
|
|
13
|
+
* The attempt at which a delivery never acknowledged becomes undeliverable
|
|
14
|
+
* instead of being handed over again: the fifth. A poison message stops there
|
|
14
15
|
* rather than looping forever.
|
|
15
16
|
*/
|
|
16
|
-
export const
|
|
17
|
+
export const UNDELIVERABLE_AT_ATTEMPT = 5;
|
|
17
18
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* crew's ship and lease. Either change is caused by the receiving ship.
|
|
19
|
+
* Counts one attempt at handing the delivery to the crew: the fifth makes it
|
|
20
|
+
* undeliverable and hands it to no one; before that, it is handed, in flight
|
|
21
|
+
* with the crew's ship and lease. A hand-over by a push receive's crew keeps
|
|
22
|
+
* its number. Either change is caused by the receiving ship.
|
|
23
23
|
*/
|
|
24
|
-
|
|
25
|
-
const { crew, at } =
|
|
24
|
+
function countAttempt(delivery, attempt) {
|
|
25
|
+
const { crew, at, handOverNumber } = attempt;
|
|
26
26
|
const attempts = delivery.attempts + 1;
|
|
27
27
|
const concerns = {
|
|
28
28
|
fleetId: delivery.fleetId,
|
|
@@ -31,36 +31,204 @@ export function claimDelivery(delivery, claim) {
|
|
|
31
31
|
shipId: crew.shipId,
|
|
32
32
|
messageId: delivery.messageId,
|
|
33
33
|
deliveryId: delivery.id,
|
|
34
|
-
details: { leaseId: crew.leaseId, attempts },
|
|
34
|
+
details: { leaseId: crew.leaseId, attempts, ...(handOverNumber !== null && { handOverNumber }) },
|
|
35
35
|
};
|
|
36
|
-
if (attempts >=
|
|
36
|
+
if (attempts >= UNDELIVERABLE_AT_ATTEMPT) {
|
|
37
37
|
return {
|
|
38
38
|
outcome: 'undeliverable',
|
|
39
|
-
delivery: { ...delivery, state: 'undeliverable', claimedByShipId: null, claimedByLeaseId: null, attempts },
|
|
39
|
+
delivery: { ...delivery, state: 'undeliverable', claimedByShipId: null, claimedByLeaseId: null, attempts, handOverNumber },
|
|
40
40
|
events: [{ ...concerns, type: 'DeliveryUndeliverable' }],
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
return {
|
|
44
|
-
outcome: '
|
|
45
|
-
delivery: { ...delivery, state: '
|
|
46
|
-
events: [{ ...concerns, type: '
|
|
44
|
+
outcome: 'handed',
|
|
45
|
+
delivery: { ...delivery, state: 'handed', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts, handOverNumber },
|
|
46
|
+
events: [{ ...concerns, type: 'DeliveryHanded' }],
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* A plain receive hands a crew a delivery it may take at once: one pending
|
|
51
|
+
* for its ship or its type, or one of its own handed, again after a lost
|
|
52
|
+
* reply. Every plain receive is one attempt (see `countAttempt`).
|
|
53
|
+
*/
|
|
54
|
+
export function handDelivery(delivery, handOver) {
|
|
55
|
+
return countAttempt(delivery, { ...handOver, handOverNumber: null });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A push receive takes a delivery for the crew's computer side, which hands
|
|
59
|
+
* it to the agent later (decision 0040). A pending one becomes received, in
|
|
60
|
+
* flight with the crew's ship and lease, with no attempt counted and no
|
|
61
|
+
* hand-over number yet. One of the crew's own in flight, received or handed,
|
|
62
|
+
* is received again: nothing changes, and DeliveryReceived marked again says
|
|
63
|
+
* so. The repository returns nothing else to a push receive.
|
|
64
|
+
*/
|
|
65
|
+
export function pushReceiveDelivery(delivery, receipt) {
|
|
66
|
+
const { crew, at } = receipt;
|
|
67
|
+
const isAgain = delivery.state !== 'pending';
|
|
68
|
+
const event = {
|
|
69
|
+
fleetId: delivery.fleetId,
|
|
70
|
+
type: 'DeliveryReceived',
|
|
71
|
+
occurredAt: at,
|
|
72
|
+
actor: shipActor(crew.shipId),
|
|
73
|
+
shipId: crew.shipId,
|
|
74
|
+
messageId: delivery.messageId,
|
|
75
|
+
deliveryId: delivery.id,
|
|
76
|
+
details: { leaseId: crew.leaseId, ...(isAgain && { again: true }) },
|
|
77
|
+
};
|
|
78
|
+
return isAgain
|
|
79
|
+
? { delivery, events: [event] }
|
|
80
|
+
: {
|
|
81
|
+
delivery: { ...delivery, state: 'received', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, handOverNumber: null },
|
|
82
|
+
events: [event],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The crew's computer side reports it handed a delivery to the agent, with
|
|
87
|
+
* its hand-over number (decision 0040). A higher number than the last is a
|
|
88
|
+
* new hand-over and counts one attempt; the fifth is undeliverable and
|
|
89
|
+
* nothing is handed. The same number again, or a lower one, is a lost
|
|
90
|
+
* answer: OK, and nothing changes, also once the agent acknowledged it. Only
|
|
91
|
+
* the crew holding the delivery hands it over; one that is not in flight is
|
|
92
|
+
* refused. Handed once more is its own rule (see `handOnceMore`).
|
|
93
|
+
*/
|
|
94
|
+
export function handOverDelivery(delivery, handOver) {
|
|
95
|
+
const { crew, handOverNumber, at } = handOver;
|
|
96
|
+
const isRepeat = delivery.handOverNumber !== null && handOverNumber <= delivery.handOverNumber;
|
|
97
|
+
switch (delivery.state) {
|
|
98
|
+
case 'received':
|
|
99
|
+
case 'handed':
|
|
100
|
+
case 'acknowledged': {
|
|
101
|
+
if (delivery.claimedByLeaseId !== crew.leaseId) {
|
|
102
|
+
return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the crew that received it hands it over`);
|
|
103
|
+
}
|
|
104
|
+
if (handOver.isOnceMore) {
|
|
105
|
+
return handOnceMore(delivery, handOver);
|
|
106
|
+
}
|
|
107
|
+
if (delivery.state !== 'received' && isRepeat) {
|
|
108
|
+
return ok({ state: delivery.state, delivery, events: [] });
|
|
109
|
+
}
|
|
110
|
+
if (delivery.state === 'acknowledged') {
|
|
111
|
+
return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is acknowledged, not in flight: its agent confirmed it, so hand it only once more, after its turn died`);
|
|
112
|
+
}
|
|
113
|
+
const { outcome, delivery: changed, events } = countAttempt(delivery, { crew, at, handOverNumber });
|
|
114
|
+
return ok({ state: outcome, delivery: changed, events });
|
|
115
|
+
}
|
|
116
|
+
case 'pending':
|
|
117
|
+
case 'handled':
|
|
118
|
+
case 'notHandled':
|
|
119
|
+
case 'undeliverable':
|
|
120
|
+
case 'dismissed':
|
|
121
|
+
case 'abandoned':
|
|
122
|
+
return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is ${delivery.state}, not in flight: hand over a delivery once a push receive took it`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* A confirmed message whose turn or session died is handed once more, the
|
|
127
|
+
* one retry (decision 0040). The fleet's promise ended at the ack, so it stays
|
|
128
|
+
* acknowledged and counts no attempt; DeliveryHanded marked once more records
|
|
129
|
+
* it. Its repeat, at the same or a lower number, is a lost answer: OK, and
|
|
130
|
+
* nothing changes. A second once more is refused: if that turn dies too, the
|
|
131
|
+
* message is not handled. Only an acknowledged delivery is handed once more.
|
|
132
|
+
*/
|
|
133
|
+
function handOnceMore(delivery, handOver) {
|
|
134
|
+
const { crew, handOverNumber, at } = handOver;
|
|
135
|
+
if (delivery.state !== 'acknowledged') {
|
|
136
|
+
return refuse('DELIVERY_NOT_ACKNOWLEDGED', `Delivery ${delivery.id} is ${delivery.state}, not acknowledged: only a confirmed message is handed once more`);
|
|
137
|
+
}
|
|
138
|
+
if (delivery.handedOnceMoreAt !== null) {
|
|
139
|
+
return delivery.handOverNumber !== null && handOverNumber <= delivery.handOverNumber
|
|
140
|
+
? ok({ state: delivery.state, delivery, events: [] })
|
|
141
|
+
: refuse('DELIVERY_HANDED_ONCE_MORE', `Delivery ${delivery.id} was handed once more already: if that turn died too, report it not handled`);
|
|
142
|
+
}
|
|
143
|
+
return ok({
|
|
144
|
+
state: delivery.state,
|
|
145
|
+
delivery: { ...delivery, handOverNumber, handedOnceMoreAt: at },
|
|
146
|
+
events: [
|
|
147
|
+
{
|
|
148
|
+
fleetId: delivery.fleetId,
|
|
149
|
+
type: 'DeliveryHanded',
|
|
150
|
+
occurredAt: at,
|
|
151
|
+
actor: shipActor(crew.shipId),
|
|
152
|
+
shipId: crew.shipId,
|
|
153
|
+
messageId: delivery.messageId,
|
|
154
|
+
deliveryId: delivery.id,
|
|
155
|
+
details: { leaseId: crew.leaseId, attempts: delivery.attempts, handOverNumber, onceMore: true },
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A pushed crew reports how the turn that took an acknowledged delivery
|
|
162
|
+
* ended (decision 0040): handled when it ended by itself, not handled when
|
|
163
|
+
* the turn it was handed once more to died too. Either writes its event,
|
|
164
|
+
* DeliveryHandled or DeliveryNotHandled, and keeps who it was handed to.
|
|
165
|
+
* The same report again is harmless: OK, and nothing changes. A delivery not
|
|
166
|
+
* acknowledged yet, or that ended the other way, is refused, so a ping not
|
|
167
|
+
* answered with pong stays handed. Not handled needs the once more first.
|
|
168
|
+
* Only the crew holding the delivery reports it.
|
|
169
|
+
*/
|
|
170
|
+
export function endTurn(delivery, report) {
|
|
171
|
+
const { crew, end, at } = report;
|
|
172
|
+
switch (delivery.state) {
|
|
173
|
+
case 'received':
|
|
174
|
+
case 'handed':
|
|
175
|
+
case 'acknowledged':
|
|
176
|
+
case 'handled':
|
|
177
|
+
case 'notHandled': {
|
|
178
|
+
if (delivery.claimedByLeaseId !== crew.leaseId) {
|
|
179
|
+
return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the crew it was handed to reports its turn`);
|
|
180
|
+
}
|
|
181
|
+
if (delivery.state === end) {
|
|
182
|
+
return ok({ delivery, events: [] });
|
|
183
|
+
}
|
|
184
|
+
if (delivery.state !== 'acknowledged') {
|
|
185
|
+
return refuse('DELIVERY_NOT_ACKNOWLEDGED', `Delivery ${delivery.id} is ${delivery.state}, not acknowledged: report how its turn ended once the agent confirmed it`);
|
|
186
|
+
}
|
|
187
|
+
if (end === 'notHandled' && delivery.handedOnceMoreAt === null) {
|
|
188
|
+
return refuse('DELIVERY_NOT_HANDED_ONCE_MORE', `Delivery ${delivery.id} was never handed once more: hand it once more after its turn died, and report it not handled only if that turn dies too`);
|
|
189
|
+
}
|
|
190
|
+
return ok({
|
|
191
|
+
delivery: { ...delivery, state: end },
|
|
192
|
+
events: [
|
|
193
|
+
{
|
|
194
|
+
fleetId: delivery.fleetId,
|
|
195
|
+
type: end === 'handled' ? 'DeliveryHandled' : 'DeliveryNotHandled',
|
|
196
|
+
occurredAt: at,
|
|
197
|
+
actor: shipActor(crew.shipId),
|
|
198
|
+
shipId: crew.shipId,
|
|
199
|
+
messageId: delivery.messageId,
|
|
200
|
+
deliveryId: delivery.id,
|
|
201
|
+
details: { leaseId: crew.leaseId },
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
case 'pending':
|
|
207
|
+
case 'undeliverable':
|
|
208
|
+
case 'dismissed':
|
|
209
|
+
case 'abandoned':
|
|
210
|
+
return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is ${delivery.state}, not in flight: report how its turn ended once the agent confirmed it`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
49
213
|
/**
|
|
50
214
|
* The ship takes responsibility for a delivery it received (ADR 0001): only a
|
|
51
|
-
* delivery in flight with that ship
|
|
52
|
-
*
|
|
215
|
+
* delivery in flight with that ship, received or handed, moves to
|
|
216
|
+
* acknowledged, keeping who it was handed to. A received one is taken too, so
|
|
217
|
+
* a lost answer to handed never blocks the agent's confirmation. Acknowledging it again, also once handled or not handled, is harmless: OK, and nothing changes. A delivery
|
|
53
218
|
* another ship holds or acknowledged, or one that is not in flight, is refused.
|
|
54
219
|
*/
|
|
55
220
|
export function acknowledgeDelivery(delivery, ack) {
|
|
56
221
|
const { crew, at } = ack;
|
|
57
222
|
switch (delivery.state) {
|
|
58
|
-
case '
|
|
223
|
+
case 'received':
|
|
224
|
+
case 'handed':
|
|
59
225
|
case 'acknowledged':
|
|
226
|
+
case 'handled':
|
|
227
|
+
case 'notHandled':
|
|
60
228
|
if (delivery.claimedByShipId !== crew.shipId) {
|
|
61
229
|
return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the ship that received it acknowledges it`);
|
|
62
230
|
}
|
|
63
|
-
if (delivery.state
|
|
231
|
+
if (delivery.state !== 'received' && delivery.state !== 'handed') {
|
|
64
232
|
return ok({ delivery, events: [] });
|
|
65
233
|
}
|
|
66
234
|
return ok({
|
|
@@ -103,18 +271,19 @@ export function answerPing(delivery, pong) {
|
|
|
103
271
|
return ok({ delivery: acknowledged.value.delivery, events });
|
|
104
272
|
}
|
|
105
273
|
/**
|
|
106
|
-
* The operator lets an undeliverable delivery go
|
|
107
|
-
* "DeliveryUndeliverable"): it becomes dismissed, kept in
|
|
108
|
-
* claims, and leaves Needs attention. The event names the
|
|
109
|
-
* delivery to a type names none. Dismissing it again is
|
|
110
|
-
* nothing changes. Any other delivery is refused: only
|
|
111
|
-
*
|
|
274
|
+
* The operator lets an undeliverable or not handled delivery go
|
|
275
|
+
* (docs/blueprint.md, "DeliveryUndeliverable"): it becomes dismissed, kept in
|
|
276
|
+
* history with its claims, and leaves Needs attention. The event names the
|
|
277
|
+
* ship it was for; a delivery to a type names none. Dismissing it again is
|
|
278
|
+
* harmless: OK, and nothing changes. Any other delivery is refused: only
|
|
279
|
+
* those two wait for the operator.
|
|
112
280
|
*/
|
|
113
281
|
export function dismissDelivery(delivery, dismiss) {
|
|
114
282
|
switch (delivery.state) {
|
|
115
283
|
case 'dismissed':
|
|
116
284
|
return ok({ delivery, events: [] });
|
|
117
285
|
case 'undeliverable':
|
|
286
|
+
case 'notHandled':
|
|
118
287
|
return ok({
|
|
119
288
|
delivery: { ...delivery, state: 'dismissed' },
|
|
120
289
|
events: [
|
|
@@ -130,25 +299,27 @@ export function dismissDelivery(delivery, dismiss) {
|
|
|
130
299
|
],
|
|
131
300
|
});
|
|
132
301
|
case 'pending':
|
|
133
|
-
case '
|
|
302
|
+
case 'received':
|
|
303
|
+
case 'handed':
|
|
134
304
|
case 'acknowledged':
|
|
305
|
+
case 'handled':
|
|
135
306
|
case 'abandoned':
|
|
136
|
-
return refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}
|
|
307
|
+
return refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}: only an undeliverable or not handled delivery is dismissed`);
|
|
137
308
|
}
|
|
138
309
|
}
|
|
139
310
|
/**
|
|
140
|
-
* A resend dismisses the delivery it resends, which must be undeliverable
|
|
141
|
-
* one already dismissed has nothing left to resend.
|
|
311
|
+
* A resend dismisses the delivery it resends, which must be undeliverable or
|
|
312
|
+
* not handled: one already dismissed has nothing left to resend.
|
|
142
313
|
*/
|
|
143
314
|
export function dismissForResend(delivery, dismiss) {
|
|
144
|
-
return delivery.state === 'undeliverable'
|
|
315
|
+
return delivery.state === 'undeliverable' || delivery.state === 'notHandled'
|
|
145
316
|
? dismissDelivery(delivery, dismiss)
|
|
146
|
-
: refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}
|
|
317
|
+
: refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}: only an undeliverable or not handled delivery is resent`);
|
|
147
318
|
}
|
|
148
319
|
/**
|
|
149
320
|
* argo marks a message to it done (docs/blueprint.md, "Inbox"): the console
|
|
150
|
-
* never receives, so an open delivery is
|
|
151
|
-
* under the console session's lease, one
|
|
321
|
+
* never receives, so an open delivery is handed and acknowledged at once
|
|
322
|
+
* under the console session's lease, one attempt counted, and its two events
|
|
152
323
|
* written as a receive and an ack would write them. One the session already
|
|
153
324
|
* holds in flight is only acknowledged. The acknowledgement names the reply
|
|
154
325
|
* that made it done, when a reply did. Marking it done again is harmless: OK,
|
|
@@ -176,15 +347,18 @@ export function markDone(delivery, done) {
|
|
|
176
347
|
};
|
|
177
348
|
switch (delivery.state) {
|
|
178
349
|
case 'acknowledged':
|
|
350
|
+
case 'handled':
|
|
351
|
+
case 'notHandled':
|
|
179
352
|
return ok({ delivery, events: [] });
|
|
180
353
|
case 'pending': {
|
|
181
354
|
const attempts = delivery.attempts + 1;
|
|
182
355
|
return ok({
|
|
183
356
|
delivery: { ...delivery, state: 'acknowledged', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts },
|
|
184
|
-
events: [{ ...concerns, type: '
|
|
357
|
+
events: [{ ...concerns, type: 'DeliveryHanded', details: { leaseId: crew.leaseId, attempts } }, acknowledged],
|
|
185
358
|
});
|
|
186
359
|
}
|
|
187
|
-
case '
|
|
360
|
+
case 'received':
|
|
361
|
+
case 'handed':
|
|
188
362
|
return delivery.claimedByLeaseId === crew.leaseId
|
|
189
363
|
? ok({ delivery: { ...delivery, state: 'acknowledged' }, events: [acknowledged] })
|
|
190
364
|
: refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another session`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/delivery.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export type DismissDelivery = (caller: Caller, input: {
|
|
|
16
16
|
deliveryId: DeliveryId;
|
|
17
17
|
}) => Promise<Result<undefined, DismissDeliveryRefusal>>;
|
|
18
18
|
/**
|
|
19
|
-
* Use case: the operator dismisses an undeliverable delivery from Needs
|
|
19
|
+
* Use case: the operator dismisses an undeliverable or not handled delivery from Needs
|
|
20
20
|
* attention. Its scope (fleet:manage) is checked before this runs. The
|
|
21
21
|
* delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
|
|
22
22
|
* work, so a resend of the same delivery waits and then finds it dismissed.
|
|
@@ -3,7 +3,7 @@ import { recordEvent } from '../shared/events.js';
|
|
|
3
3
|
import { ok } from '../shared/result.js';
|
|
4
4
|
import { dismissDelivery } from './delivery.js';
|
|
5
5
|
/**
|
|
6
|
-
* Use case: the operator dismisses an undeliverable delivery from Needs
|
|
6
|
+
* Use case: the operator dismisses an undeliverable or not handled delivery from Needs
|
|
7
7
|
* attention. Its scope (fleet:manage) is checked before this runs. The
|
|
8
8
|
* delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
|
|
9
9
|
* work, so a resend of the same delivery waits and then finds it dismissed.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import { type HoldLeaseTx, type LeaseEnded } from '../registry/public.js';
|
|
3
|
+
import type { Crew } from '../shared/caller.js';
|
|
4
|
+
import type { Clock } from '../shared/clock.js';
|
|
5
|
+
import { type DomainError } from '../shared/errors.js';
|
|
6
|
+
import { type EventLog } from '../shared/events.js';
|
|
7
|
+
import { type Result } from '../shared/result.js';
|
|
8
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
9
|
+
import { type HandedState, type HandOverRefusal } from './delivery.js';
|
|
10
|
+
import type { DeliveryRepository } from './ports.js';
|
|
11
|
+
export interface HandOverDeliveryTx extends HoldLeaseTx {
|
|
12
|
+
deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
|
|
13
|
+
events: EventLog;
|
|
14
|
+
}
|
|
15
|
+
export type HandOverDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | HandOverRefusal | LeaseEnded;
|
|
16
|
+
export type HandOverDelivery = (crew: Crew, input: {
|
|
17
|
+
deliveryId: DeliveryId;
|
|
18
|
+
handOverNumber: number;
|
|
19
|
+
isOnceMore?: boolean;
|
|
20
|
+
}) => Promise<Result<{
|
|
21
|
+
state: HandedState;
|
|
22
|
+
}, HandOverDeliveryRefusal>>;
|
|
23
|
+
/**
|
|
24
|
+
* Use case: the crew's computer side reports it handed a delivery to the
|
|
25
|
+
* agent (`handed`, decision 0040), with its hand-over number. Its scope
|
|
26
|
+
* (messages:receive) is checked before this runs. In one unit of work it
|
|
27
|
+
* holds the crew's lease, so a release waits for it, locks the delivery and
|
|
28
|
+
* applies the hand-over: a new number counts one attempt and writes
|
|
29
|
+
* DeliveryHanded, the fifth is undeliverable instead, and a repeated number
|
|
30
|
+
* changes nothing. Handed once more keeps a confirmed message acknowledged
|
|
31
|
+
* and writes DeliveryHanded marked once more, only once. The lock makes a hand-over, an ack and a receive of the
|
|
32
|
+
* same delivery take turns. It answers where the delivery stands.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createHandOverDelivery(deps: {
|
|
35
|
+
uow: UnitOfWork<HandOverDeliveryTx>;
|
|
36
|
+
clock: Clock;
|
|
37
|
+
ids: IdGenerator;
|
|
38
|
+
}): HandOverDelivery;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { holdLease } from '../registry/public.js';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { recordEvent } from '../shared/events.js';
|
|
4
|
+
import { ok } from '../shared/result.js';
|
|
5
|
+
import { handOverDelivery } from './delivery.js';
|
|
6
|
+
/**
|
|
7
|
+
* Use case: the crew's computer side reports it handed a delivery to the
|
|
8
|
+
* agent (`handed`, decision 0040), with its hand-over number. Its scope
|
|
9
|
+
* (messages:receive) is checked before this runs. In one unit of work it
|
|
10
|
+
* holds the crew's lease, so a release waits for it, locks the delivery and
|
|
11
|
+
* applies the hand-over: a new number counts one attempt and writes
|
|
12
|
+
* DeliveryHanded, the fifth is undeliverable instead, and a repeated number
|
|
13
|
+
* changes nothing. Handed once more keeps a confirmed message acknowledged
|
|
14
|
+
* and writes DeliveryHanded marked once more, only once. The lock makes a hand-over, an ack and a receive of the
|
|
15
|
+
* same delivery take turns. It answers where the delivery stands.
|
|
16
|
+
*/
|
|
17
|
+
export function createHandOverDelivery(deps) {
|
|
18
|
+
return (crew, input) => deps.uow.run(async (tx) => {
|
|
19
|
+
const held = await holdLease(tx, crew);
|
|
20
|
+
if (!held.isOk) {
|
|
21
|
+
return held;
|
|
22
|
+
}
|
|
23
|
+
const delivery = await tx.deliveries.findForUpdate(crew.fleetId, input.deliveryId);
|
|
24
|
+
if (!delivery) {
|
|
25
|
+
return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
|
|
26
|
+
}
|
|
27
|
+
const handedOver = handOverDelivery(delivery, {
|
|
28
|
+
crew,
|
|
29
|
+
handOverNumber: input.handOverNumber,
|
|
30
|
+
isOnceMore: input.isOnceMore === true,
|
|
31
|
+
at: deps.clock.now(),
|
|
32
|
+
});
|
|
33
|
+
if (!handedOver.isOk) {
|
|
34
|
+
return handedOver;
|
|
35
|
+
}
|
|
36
|
+
const { state, delivery: changed, events } = handedOver.value;
|
|
37
|
+
if (events.length > 0) {
|
|
38
|
+
await tx.deliveries.update(changed);
|
|
39
|
+
}
|
|
40
|
+
for (const event of events) {
|
|
41
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
42
|
+
}
|
|
43
|
+
return ok({ state });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=hand-over-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hand-over-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/hand-over-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAqC,MAAM,uBAAuB,CAAC;AAGrF,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAA0C,MAAM,eAAe,CAAC;AAezF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoE,EAAE;QAC1F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,EAAE;YAC5C,IAAI;YACJ,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI;YACrC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -47,8 +47,19 @@ export interface Delivery {
|
|
|
47
47
|
*/
|
|
48
48
|
claimedByShipId: ShipId | null;
|
|
49
49
|
claimedByLeaseId: LeaseId | null;
|
|
50
|
-
/** How many times
|
|
50
|
+
/** How many times it was handed over: once per plain receive, or once per new hand-over number on a pushed ship. */
|
|
51
51
|
attempts: number;
|
|
52
|
+
/**
|
|
53
|
+
* The last hand-over number its crew reported with handed: a repeat of it,
|
|
54
|
+
* or a lower one, changes nothing. None until a push receive's crew hands it
|
|
55
|
+
* over, and none again once it returns to pending.
|
|
56
|
+
*/
|
|
57
|
+
handOverNumber: number | null;
|
|
58
|
+
/**
|
|
59
|
+
* When its crew handed it once more, after the turn that took it died
|
|
60
|
+
* (decision 0040): only once, so none until then.
|
|
61
|
+
*/
|
|
62
|
+
handedOnceMoreAt: Date | null;
|
|
52
63
|
/**
|
|
53
64
|
* For a type, under network rules: the ships of the type its sender may
|
|
54
65
|
* reach, fixed at send time; only they may claim it (decision 0034).
|
|
@@ -58,6 +58,8 @@ export function acceptMessage(fleet, send) {
|
|
|
58
58
|
claimedByShipId: null,
|
|
59
59
|
claimedByLeaseId: null,
|
|
60
60
|
attempts: 0,
|
|
61
|
+
handOverNumber: null,
|
|
62
|
+
handedOnceMoreAt: null,
|
|
61
63
|
...(reachableShipIds && { reachableShipIds: [...reachableShipIds] }),
|
|
62
64
|
createdAt: at,
|
|
63
65
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+G,MAAM,sBAAsB,CAAC;AAEtK,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The 10 and 60 minute clocks of a pushed ship (#586, decision 0040). The
|
|
3
|
+
* fleet runs them from the states and the turn the computer side reports, so
|
|
4
|
+
* a computer that died leaves the source of truth true. argo is told once per
|
|
5
|
+
* lease and oldest delivery whose clock ran out.
|
|
6
|
+
*/
|
|
7
|
+
import type { DeliveryId, FleetId, LeaseId, MessageId, ShipId, TurnState } from '@aeolus-fleet/common';
|
|
8
|
+
import { type NewEvent } from '../shared/events.js';
|
|
9
|
+
/** A delivery handed and not confirmed this long is overdue, whatever the turn. */
|
|
10
|
+
export declare const NOT_CONFIRMED_MINUTES = 10;
|
|
11
|
+
/** A delivery waiting this long while the session is idle is overdue. */
|
|
12
|
+
export declare const IDLE_MINUTES = 10;
|
|
13
|
+
/** A delivery waiting this long while the session is busy is overdue. */
|
|
14
|
+
export declare const BUSY_MINUTES = 60;
|
|
15
|
+
/** Which clock ran out: handed and not confirmed, or waiting while idle or busy. */
|
|
16
|
+
export type OverdueClock = 'notConfirmed' | 'idle' | 'busy';
|
|
17
|
+
/** The states a delivery waits in for a pushed ship: pending for it, or in flight with its lease. */
|
|
18
|
+
export type WaitingState = 'pending' | 'received' | 'handed';
|
|
19
|
+
/** A delivery waiting for a pushed crew, and since when it is in its state. */
|
|
20
|
+
export interface WaitingDelivery {
|
|
21
|
+
deliveryId: DeliveryId;
|
|
22
|
+
messageId: MessageId;
|
|
23
|
+
state: WaitingState;
|
|
24
|
+
/** When it entered its state: stored, returned, received, or handed with its latest hand-over number. */
|
|
25
|
+
since: Date;
|
|
26
|
+
/** When its message was sent: the oldest waiting is told first. */
|
|
27
|
+
sentAt: Date;
|
|
28
|
+
}
|
|
29
|
+
/** An open pushed lease, with its turn and the deliveries waiting for it. */
|
|
30
|
+
export interface PushedCrew {
|
|
31
|
+
fleetId: FleetId;
|
|
32
|
+
shipId: ShipId;
|
|
33
|
+
leaseId: LeaseId;
|
|
34
|
+
pushedAt: Date;
|
|
35
|
+
/** The turn its hooks last reported, since when; null before the first report. */
|
|
36
|
+
turn: {
|
|
37
|
+
state: TurnState;
|
|
38
|
+
at: Date;
|
|
39
|
+
} | null;
|
|
40
|
+
waiting: WaitingDelivery[];
|
|
41
|
+
}
|
|
42
|
+
/** A delivery whose clock ran out on a pushed crew's lease. */
|
|
43
|
+
export interface Overdue {
|
|
44
|
+
fleetId: FleetId;
|
|
45
|
+
shipId: ShipId;
|
|
46
|
+
leaseId: LeaseId;
|
|
47
|
+
delivery: WaitingDelivery;
|
|
48
|
+
clock: OverdueClock;
|
|
49
|
+
minutes: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The crew's oldest waiting delivery whose clock ran out, if any. A handed
|
|
53
|
+
* delivery runs the 10 minute clock from its hand-over. A pending or received
|
|
54
|
+
* one runs 10 minutes while the session is idle and 60 while it is busy,
|
|
55
|
+
* counted from the latest of its state, the turn and the lease's push: a
|
|
56
|
+
* lease with no turn reported is idle since it was pushed.
|
|
57
|
+
*/
|
|
58
|
+
export declare function overdueDelivery(crew: PushedCrew, now: Date): Overdue | undefined;
|
|
59
|
+
/** DeliveryOverdue: the fleet told argo, as the system, that the delivery's clock ran out. */
|
|
60
|
+
export declare function overdueEvent(overdue: Overdue, at: Date): NewEvent;
|