@aeolus-fleet/core 0.20.2 → 0.20.4
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 +1 -1
- package/dist/adapters/http/server.d.ts +0 -2
- package/dist/adapters/http/server.js +4 -12
- package/dist/adapters/http/server.js.map +1 -1
- package/dist/adapters/prisma/client.d.ts +0 -2
- package/dist/adapters/prisma/client.js +0 -9
- package/dist/adapters/prisma/client.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +23 -0
- package/dist/adapters/prisma/generated/client.d.ts +23 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +33 -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 +254 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +25 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +28 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +25 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +149 -0
- package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.d.ts +1468 -0
- package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.js +2 -0
- package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +68 -1
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +716 -0
- package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +1101 -0
- package/dist/adapters/prisma/generated/models/NetworkSettings.js +2 -0
- package/dist/adapters/prisma/generated/models/NetworkSettings.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +1239 -0
- package/dist/adapters/prisma/generated/models/ReachRefusal.js +2 -0
- package/dist/adapters/prisma/generated/models/ReachRefusal.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +255 -0
- package/dist/adapters/prisma/generated/models.d.ts +3 -0
- package/dist/adapters/prisma/messaging.js +16 -2
- package/dist/adapters/prisma/messaging.js.map +1 -1
- package/dist/adapters/prisma/network.d.ts +4 -0
- package/dist/adapters/prisma/network.js +69 -0
- package/dist/adapters/prisma/network.js.map +1 -0
- package/dist/adapters/prisma/registry.js +20 -5
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/rows.js +10 -1
- package/dist/adapters/prisma/rows.js.map +1 -1
- package/dist/adapters/prisma/unit-of-work.d.ts +3 -1
- package/dist/adapters/prisma/unit-of-work.js +3 -0
- package/dist/adapters/prisma/unit-of-work.js.map +1 -1
- package/dist/adapters/trpc/console.d.ts +1 -1
- package/dist/adapters/trpc/context.d.ts +6 -0
- package/dist/adapters/trpc/fleet.d.ts +96 -6
- package/dist/adapters/trpc/fleet.js +46 -3
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +94 -7
- package/dist/adapters/trpc/ship-contract.js +2 -0
- package/dist/adapters/trpc/ship-contract.js.map +1 -1
- package/dist/adapters/trpc/ship-protocol.js +9 -8
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/trpc.js +4 -0
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/app.js +1 -2
- package/dist/app.js.map +1 -1
- package/dist/domain/messaging/answer.d.ts +17 -0
- package/dist/domain/messaging/answer.js +16 -0
- package/dist/domain/messaging/answer.js.map +1 -0
- package/dist/domain/messaging/message.d.ts +10 -1
- package/dist/domain/messaging/message.js +4 -2
- package/dist/domain/messaging/message.js.map +1 -1
- package/dist/domain/messaging/ports.d.ts +2 -0
- package/dist/domain/messaging/resend-delivery.d.ts +11 -4
- package/dist/domain/messaging/resend-delivery.js +87 -62
- package/dist/domain/messaging/resend-delivery.js.map +1 -1
- package/dist/domain/messaging/send-message.d.ts +11 -4
- package/dist/domain/messaging/send-message.js +32 -6
- package/dist/domain/messaging/send-message.js.map +1 -1
- package/dist/domain/registry/check-reach.d.ts +44 -0
- package/dist/domain/registry/check-reach.js +75 -0
- package/dist/domain/registry/check-reach.js.map +1 -0
- package/dist/domain/registry/crew-request.d.ts +32 -0
- package/dist/domain/registry/crew-request.js +53 -0
- package/dist/domain/registry/crew-request.js.map +1 -1
- package/dist/domain/registry/get-ship.d.ts +3 -3
- package/dist/domain/registry/get-ship.js +2 -1
- package/dist/domain/registry/get-ship.js.map +1 -1
- package/dist/domain/registry/give-back-crew-request.d.ts +35 -0
- package/dist/domain/registry/give-back-crew-request.js +44 -0
- package/dist/domain/registry/give-back-crew-request.js.map +1 -0
- package/dist/domain/registry/list-fleet.d.ts +3 -1
- package/dist/domain/registry/list-fleet.js +2 -1
- package/dist/domain/registry/list-fleet.js.map +1 -1
- package/dist/domain/registry/network-settings.d.ts +58 -0
- package/dist/domain/registry/network-settings.js +81 -0
- package/dist/domain/registry/network-settings.js.map +1 -0
- package/dist/domain/registry/ports.d.ts +32 -0
- package/dist/domain/registry/public.d.ts +1 -0
- package/dist/domain/registry/public.js +1 -0
- package/dist/domain/registry/public.js.map +1 -1
- package/dist/domain/registry/reach-refusal.d.ts +30 -0
- package/dist/domain/registry/reach-refusal.js +2 -0
- package/dist/domain/registry/reach-refusal.js.map +1 -0
- package/dist/domain/registry/read-reach-refusals.d.ts +14 -0
- package/dist/domain/registry/read-reach-refusals.js +17 -0
- package/dist/domain/registry/read-reach-refusals.js.map +1 -0
- package/dist/domain/registry/set-network-rules.d.ts +29 -0
- package/dist/domain/registry/set-network-rules.js +25 -0
- package/dist/domain/registry/set-network-rules.js.map +1 -0
- package/dist/domain/registry/ship-report.d.ts +5 -0
- package/dist/domain/registry/ship-report.js +3 -0
- package/dist/domain/registry/ship-report.js.map +1 -1
- 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 +17 -0
- package/dist/domain/shared/history.js +4 -1
- package/dist/domain/shared/history.js.map +1 -1
- package/dist/domain/shared/read-needs-attention.d.ts +4 -4
- package/dist/domain/shared/read-needs-attention.js +4 -3
- package/dist/domain/shared/read-needs-attention.js.map +1 -1
- package/dist/domain/shared/read-ship-timeline.d.ts +5 -4
- package/dist/domain/shared/read-ship-timeline.js +7 -3
- package/dist/domain/shared/read-ship-timeline.js.map +1 -1
- package/dist/wiring.d.ts +6 -0
- package/dist/wiring.js +7 -0
- package/dist/wiring.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/prisma/migrations/20261009090000_crew_request_give_backs/migration.sql +26 -0
- package/src/adapters/prisma/migrations/20261009200000_network_scope/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261009210000_network_rules/migration.sql +31 -0
- package/src/adapters/prisma/migrations/20261009220000_type_delivery_reachable_ships/migration.sql +5 -0
- package/src/adapters/prisma/schema.prisma +59 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoC,MAAM,sBAAsB,CAAC;AAE9G,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { FleetId, IdGenerator, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
import type { Recipient } from '../shared/selector.js';
|
|
5
|
+
import type { LabelRepository, NetworkSettingsRepository, ReachRefusalRepository, ShipRepository } from './ports.js';
|
|
6
|
+
/** The ports a send's reach check reads and writes, inside the send's unit of work. */
|
|
7
|
+
export interface CheckReachTx {
|
|
8
|
+
networkSettings: Pick<NetworkSettingsRepository, 'findForShare'>;
|
|
9
|
+
ships: Pick<ShipRepository, 'find' | 'listActiveOfType'>;
|
|
10
|
+
labels: Pick<LabelRepository, 'carriedBy' | 'find'>;
|
|
11
|
+
reachRefusals: ReachRefusalRepository;
|
|
12
|
+
}
|
|
13
|
+
/** One fixed message, so a refused sender learns nothing about the rules (decision 0034). */
|
|
14
|
+
export type NotReachable = DomainError<'NOT_REACHABLE'>;
|
|
15
|
+
/** What a send may go on with: for a type, the ships of it the sender may reach, or none for any ship of it. */
|
|
16
|
+
export interface Reach {
|
|
17
|
+
reachableShipIds?: readonly ShipId[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Whether the fleet's network rules let the sender reach the recipient a
|
|
21
|
+
* selector resolved to, at send time: Messaging's question to Registry before
|
|
22
|
+
* it stores a message (decision 0034). The settings stay held shared until
|
|
23
|
+
* the unit of work ends, so a change of rules waits for the send, and a send
|
|
24
|
+
* that comes after it is checked against the new version.
|
|
25
|
+
*
|
|
26
|
+
* For a type, the ships of it the sender may reach now are the ones that may
|
|
27
|
+
* claim the delivery, fixed here; none of them refuses the send. With no
|
|
28
|
+
* rules, or from argo, who reaches every ship, any ship of the type may.
|
|
29
|
+
*
|
|
30
|
+
* A refusal is recorded here, in the send's unit of work, with the ships and
|
|
31
|
+
* the label values they carry now and the settings version: the send stores
|
|
32
|
+
* nothing else, so its caller commits only the record. `isAnswerToSender` says
|
|
33
|
+
* the send answers the sender of a message the sending ship received.
|
|
34
|
+
*/
|
|
35
|
+
export declare function checkReach(deps: {
|
|
36
|
+
tx: CheckReachTx;
|
|
37
|
+
ids: IdGenerator;
|
|
38
|
+
}, send: {
|
|
39
|
+
fleetId: FleetId;
|
|
40
|
+
senderShipId: ShipId;
|
|
41
|
+
recipient: Recipient;
|
|
42
|
+
isAnswerToSender: boolean;
|
|
43
|
+
at: Date;
|
|
44
|
+
}): Promise<Result<Reach, NotReachable>>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { allowsReach } from './network-settings.js';
|
|
4
|
+
/**
|
|
5
|
+
* Whether the fleet's network rules let the sender reach the recipient a
|
|
6
|
+
* selector resolved to, at send time: Messaging's question to Registry before
|
|
7
|
+
* it stores a message (decision 0034). The settings stay held shared until
|
|
8
|
+
* the unit of work ends, so a change of rules waits for the send, and a send
|
|
9
|
+
* that comes after it is checked against the new version.
|
|
10
|
+
*
|
|
11
|
+
* For a type, the ships of it the sender may reach now are the ones that may
|
|
12
|
+
* claim the delivery, fixed here; none of them refuses the send. With no
|
|
13
|
+
* rules, or from argo, who reaches every ship, any ship of the type may.
|
|
14
|
+
*
|
|
15
|
+
* A refusal is recorded here, in the send's unit of work, with the ships and
|
|
16
|
+
* the label values they carry now and the settings version: the send stores
|
|
17
|
+
* nothing else, so its caller commits only the record. `isAnswerToSender` says
|
|
18
|
+
* the send answers the sender of a message the sending ship received.
|
|
19
|
+
*/
|
|
20
|
+
export async function checkReach(deps, send) {
|
|
21
|
+
const { tx, ids } = deps;
|
|
22
|
+
const { fleetId, recipient } = send;
|
|
23
|
+
const settings = await tx.networkSettings.findForShare(fleetId);
|
|
24
|
+
const senderShip = await tx.ships.find(fleetId, send.senderShipId);
|
|
25
|
+
if (settings.rules === null || !senderShip || senderShip.kind === 'operator') {
|
|
26
|
+
return ok({});
|
|
27
|
+
}
|
|
28
|
+
const sender = await shipAsItIs(tx, senderShip);
|
|
29
|
+
const allows = (to) => allowsReach(settings, { sender: reaching(sender), recipient: reaching(to), isAnswerToSender: send.isAnswerToSender });
|
|
30
|
+
const refusal = { fleetId, at: send.at, sender: refused(sender), settingsVersion: settings.version };
|
|
31
|
+
if (recipient.kind === 'type') {
|
|
32
|
+
const ships = [];
|
|
33
|
+
for (const ship of await tx.ships.listActiveOfType(fleetId, recipient.type)) {
|
|
34
|
+
ships.push(await shipAsItIs(tx, ship));
|
|
35
|
+
}
|
|
36
|
+
const reachable = ships.filter(allows);
|
|
37
|
+
if (reachable.length > 0) {
|
|
38
|
+
return ok({ reachableShipIds: reachable.map(({ ship }) => ship.id) });
|
|
39
|
+
}
|
|
40
|
+
await tx.reachRefusals.record({ ...refusal, id: ids('reachRefusal'), recipient: { kind: 'type', type: recipient.type, ships: ships.map(refused) } });
|
|
41
|
+
return refuse('NOT_REACHABLE', NOT_REACHABLE_MESSAGE);
|
|
42
|
+
}
|
|
43
|
+
const reachedShip = await tx.ships.find(fleetId, recipient.shipId);
|
|
44
|
+
if (!reachedShip) {
|
|
45
|
+
// resolveSelector found it in this unit of work: a ship is never deleted, only retired.
|
|
46
|
+
return ok({});
|
|
47
|
+
}
|
|
48
|
+
const reached = await shipAsItIs(tx, reachedShip);
|
|
49
|
+
if (allows(reached)) {
|
|
50
|
+
return ok({});
|
|
51
|
+
}
|
|
52
|
+
await tx.reachRefusals.record({ ...refusal, id: ids('reachRefusal'), recipient: { kind: 'ship', ship: refused(reached) } });
|
|
53
|
+
return refuse('NOT_REACHABLE', NOT_REACHABLE_MESSAGE);
|
|
54
|
+
}
|
|
55
|
+
const NOT_REACHABLE_MESSAGE = 'The network rules do not allow this send';
|
|
56
|
+
/** The ship with the label values it carries now, by key then value, with their texts. */
|
|
57
|
+
async function shipAsItIs(tx, ship) {
|
|
58
|
+
const labels = [];
|
|
59
|
+
for (const carried of await tx.labels.carriedBy(ship.fleetId, ship.id)) {
|
|
60
|
+
const label = await tx.labels.find(ship.fleetId, carried.labelId);
|
|
61
|
+
const value = label?.values.find((held) => held.id === carried.valueId);
|
|
62
|
+
if (label && value) {
|
|
63
|
+
labels.push({ labelId: label.id, key: label.key, valueId: value.id, value: value.value });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
labels.sort((first, second) => first.key.localeCompare(second.key) || first.value.localeCompare(second.value));
|
|
67
|
+
return { ship, labels };
|
|
68
|
+
}
|
|
69
|
+
function reaching({ ship, labels }) {
|
|
70
|
+
return { kind: ship.kind, labels: labels.map((label) => label.valueId) };
|
|
71
|
+
}
|
|
72
|
+
function refused({ ship, labels }) {
|
|
73
|
+
return { id: ship.id, name: ship.name, labels };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=check-reach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/check-reach.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AAqBvE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA4C,EAC5C,IAA2G;IAE3G,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACnE,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,CAAC,EAAc,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzJ,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAErG,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrJ,OAAO,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,wFAAwF;QACxF,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5H,OAAO,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AAOzE,0FAA0F;AAC1F,KAAK,UAAU,UAAU,CAAC,EAAgB,EAAE,IAAU;IACpD,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/G,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAc;IAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAc;IAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -32,6 +32,15 @@ export interface CrewRequest {
|
|
|
32
32
|
attempt: number;
|
|
33
33
|
/** When the session its trierarch runs now started, written with the status; null while none runs. */
|
|
34
34
|
sessionStartedAt: Date | null;
|
|
35
|
+
/** The trierarchs that gave it back before their crew was final, oldest first (#382); cleared on every new settings version. */
|
|
36
|
+
givenBack: GiveBack[];
|
|
37
|
+
}
|
|
38
|
+
/** A trierarch that gave the request back, the settings version it tried, why, and when. */
|
|
39
|
+
export interface GiveBack {
|
|
40
|
+
trierarchShipId: ShipId;
|
|
41
|
+
settingsVersion: number;
|
|
42
|
+
reason: string;
|
|
43
|
+
givenBackAt: Date;
|
|
35
44
|
}
|
|
36
45
|
type NotFound = DomainError<'CREW_REQUEST_NOT_FOUND'>;
|
|
37
46
|
type Releasing = DomainError<'CREW_REQUEST_RELEASING'>;
|
|
@@ -141,6 +150,29 @@ export declare function confirmCrewRelease({ ship, current, trierarchShipId }: {
|
|
|
141
150
|
}): Result<{
|
|
142
151
|
events: NewEvent[];
|
|
143
152
|
}, NotFound | NotTheCallers | DomainError<'CREW_REQUEST_NOT_RELEASING'>>;
|
|
153
|
+
export type GiveBackCrewRequestRefusal = NotFound | NotTheCallers | Releasing | DomainError<'CREW_REQUEST_FINAL' | 'CREW_REQUEST_SETTINGS_CHANGED' | 'INVALID_CREW_REQUEST_REASON'>;
|
|
154
|
+
/**
|
|
155
|
+
* The assigned trierarch gives back a request it tried to fulfil and failed,
|
|
156
|
+
* with a reason (#382): only while its crew is not final, its status none or
|
|
157
|
+
* crewing, and only the settings version it tried. The request is unassigned
|
|
158
|
+
* again, its status cleared, and the trierarch recorded, with
|
|
159
|
+
* CrewRequestGivenBack, so placement leaves it out. A repeat by the same
|
|
160
|
+
* trierarch for the same version, after a lost answer, is an OK with no
|
|
161
|
+
* event. The use case ends the ship's lease with it.
|
|
162
|
+
*/
|
|
163
|
+
export declare function giveBackCrewRequest({ ship, current, trierarchShipId }: {
|
|
164
|
+
ship: Ship;
|
|
165
|
+
current: CrewRequest | undefined;
|
|
166
|
+
trierarchShipId: ShipId;
|
|
167
|
+
}, input: {
|
|
168
|
+
settingsVersion: number;
|
|
169
|
+
reason: string;
|
|
170
|
+
at: Date;
|
|
171
|
+
actor: Actor;
|
|
172
|
+
}): Result<{
|
|
173
|
+
request: CrewRequest;
|
|
174
|
+
events: NewEvent[];
|
|
175
|
+
}, GiveBackCrewRequestRefusal>;
|
|
144
176
|
/**
|
|
145
177
|
* Whether the caller reaches the ship for a fleet action it may take with one
|
|
146
178
|
* of the broad scopes, or with crew:run: crew:run reaches only the ships
|
|
@@ -3,6 +3,8 @@ import { hasScope } from '../shared/caller.js';
|
|
|
3
3
|
import { refuse } from '../shared/errors.js';
|
|
4
4
|
import { ok } from '../shared/result.js';
|
|
5
5
|
import { checkCanBeRequestedCrew } from './ship.js';
|
|
6
|
+
/** The statuses of a crew that is final (#382): its trierarch saw it working, so the request is no longer given back. */
|
|
7
|
+
const FINAL_STATUSES = new Set(['running', 'restarting', 'crashed']);
|
|
6
8
|
function notFound(ship) {
|
|
7
9
|
return refuse('CREW_REQUEST_NOT_FOUND', `${ship.name} has no crew request`);
|
|
8
10
|
}
|
|
@@ -40,6 +42,8 @@ export function requestCrew({ ship, current }, input) {
|
|
|
40
42
|
reason: current?.reason ?? null,
|
|
41
43
|
attempt: current?.attempt ?? 0,
|
|
42
44
|
sessionStartedAt: current?.sessionStartedAt ?? null,
|
|
45
|
+
// New settings may fit the trierarchs that gave the old ones back.
|
|
46
|
+
givenBack: [],
|
|
43
47
|
};
|
|
44
48
|
return ok({ request, events: [event(ship, { at: input.at, actor: input.actor, type: 'CrewRequested', details: { settingsVersion: request.settingsVersion } })] });
|
|
45
49
|
}
|
|
@@ -162,6 +166,55 @@ export function confirmCrewRelease({ ship, current, trierarchShipId }, input) {
|
|
|
162
166
|
}
|
|
163
167
|
return ok({ events: [event(ship, { ...input, type: 'CrewRequestRemoved' })] });
|
|
164
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* The assigned trierarch gives back a request it tried to fulfil and failed,
|
|
171
|
+
* with a reason (#382): only while its crew is not final, its status none or
|
|
172
|
+
* crewing, and only the settings version it tried. The request is unassigned
|
|
173
|
+
* again, its status cleared, and the trierarch recorded, with
|
|
174
|
+
* CrewRequestGivenBack, so placement leaves it out. A repeat by the same
|
|
175
|
+
* trierarch for the same version, after a lost answer, is an OK with no
|
|
176
|
+
* event. The use case ends the ship's lease with it.
|
|
177
|
+
*/
|
|
178
|
+
export function giveBackCrewRequest({ ship, current, trierarchShipId }, input) {
|
|
179
|
+
if (!current) {
|
|
180
|
+
return notFound(ship);
|
|
181
|
+
}
|
|
182
|
+
const isRepeat = current.givenBack.some((back) => back.trierarchShipId === trierarchShipId && back.settingsVersion === input.settingsVersion);
|
|
183
|
+
if (isRepeat && current.assignedTo !== trierarchShipId) {
|
|
184
|
+
return ok({ request: current, events: [] });
|
|
185
|
+
}
|
|
186
|
+
const assigned = checkAssignedTo({ ship, current, trierarchShipId });
|
|
187
|
+
if (!assigned.isOk) {
|
|
188
|
+
return assigned;
|
|
189
|
+
}
|
|
190
|
+
if (current.status === 'releasing') {
|
|
191
|
+
return refuse('CREW_REQUEST_RELEASING', `${ship.name}'s crew request is releasing: stop its session, end its lease and confirm`);
|
|
192
|
+
}
|
|
193
|
+
if (current.status !== null && FINAL_STATUSES.has(current.status)) {
|
|
194
|
+
return refuse('CREW_REQUEST_FINAL', `${ship.name}'s crew is final (${current.status}): a request is given back only before its crew works`);
|
|
195
|
+
}
|
|
196
|
+
if (input.settingsVersion !== current.settingsVersion) {
|
|
197
|
+
return refuse('CREW_REQUEST_SETTINGS_CHANGED', `${ship.name}'s crew request is at settings version ${String(current.settingsVersion)}, not ${String(input.settingsVersion)}: crew the new settings`);
|
|
198
|
+
}
|
|
199
|
+
const reason = input.reason.trim();
|
|
200
|
+
if (reason === '' || reason.length > CREW_REQUEST_REASON_MAX_LENGTH || !isOneLine(reason)) {
|
|
201
|
+
return refuse('INVALID_CREW_REQUEST_REASON', `A reason is one line of at most ${String(CREW_REQUEST_REASON_MAX_LENGTH)} characters`);
|
|
202
|
+
}
|
|
203
|
+
const back = { trierarchShipId, settingsVersion: input.settingsVersion, reason, givenBackAt: input.at };
|
|
204
|
+
return ok({
|
|
205
|
+
request: {
|
|
206
|
+
...current,
|
|
207
|
+
assignedTo: null,
|
|
208
|
+
status: null,
|
|
209
|
+
attempt: 0,
|
|
210
|
+
sessionStartedAt: null,
|
|
211
|
+
givenBack: [...current.givenBack.filter((held) => held.trierarchShipId !== trierarchShipId), back],
|
|
212
|
+
},
|
|
213
|
+
events: [
|
|
214
|
+
event(ship, { at: input.at, actor: input.actor, type: 'CrewRequestGivenBack', details: { trierarchShipId, settingsVersion: input.settingsVersion, reason } }),
|
|
215
|
+
],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
165
218
|
/**
|
|
166
219
|
* Whether the caller reaches the ship for a fleet action it may take with one
|
|
167
220
|
* of the broad scopes, or with crew:run: crew:run reaches only the ships
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/crew-request.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,SAAS,EACT,wBAAwB,GAKzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAA0C,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/crew-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,13 +5,13 @@ import { type Result } from '../shared/result.js';
|
|
|
5
5
|
import { type ListedShip } from './list-fleet.js';
|
|
6
6
|
import { type CrewRequest } from './crew-request.js';
|
|
7
7
|
import type { FleetListing } from './ports.js';
|
|
8
|
-
import type
|
|
8
|
+
import { type ShownReport } from './ship-report.js';
|
|
9
9
|
/** One ship for its page: as the fleet lists it, with its crew's report whole, when it was commissioned and since when it is crewed. */
|
|
10
10
|
export interface ShipDetail extends Omit<ListedShip, 'report' | 'crewRequest'> {
|
|
11
11
|
/** The ship's crew request, settings included; null when it holds none. */
|
|
12
12
|
crewRequest: (NonNullable<ListedShip['crewRequest']> & Pick<CrewRequest, 'settings'>) | null;
|
|
13
|
-
/** The crew's last report, details included; null until it reports, and while no session crews the ship. */
|
|
14
|
-
report:
|
|
13
|
+
/** The crew's last report, details and their size included; null until it reports, and while no session crews the ship. */
|
|
14
|
+
report: ShownReport | null;
|
|
15
15
|
commissionedAt: Date;
|
|
16
16
|
/** Since when the session crewing it has held it; null while no session does. */
|
|
17
17
|
crewedSince: Date | null;
|
|
@@ -2,6 +2,7 @@ import { refuse } from '../shared/errors.js';
|
|
|
2
2
|
import { ok } from '../shared/result.js';
|
|
3
3
|
import { listedShipOf } from './list-fleet.js';
|
|
4
4
|
import { checkReaches } from './crew-request.js';
|
|
5
|
+
import { shownReportOf } from './ship-report.js';
|
|
5
6
|
/** The scopes that read every ship; crew:run reads only the ships assigned to the caller's ship. */
|
|
6
7
|
const READ_SCOPES = ['fleet:read'];
|
|
7
8
|
/**
|
|
@@ -24,7 +25,7 @@ export function createGetShip(deps) {
|
|
|
24
25
|
const counts = await deps.listing.deliveryCounts(caller.fleetId, shipId);
|
|
25
26
|
return ok({
|
|
26
27
|
...listed,
|
|
27
|
-
report: facts.openLease?.report
|
|
28
|
+
report: facts.openLease?.report ? shownReportOf(facts.openLease.report) : null,
|
|
28
29
|
crewRequest: listed.crewRequest && facts.crewRequest && { ...listed.crewRequest, settings: facts.crewRequest.settings },
|
|
29
30
|
inFlightDeliveries: counts.inFlight,
|
|
30
31
|
openDeliveries: counts.open,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-ship.js","sourceRoot":"","sources":["../../../src/domain/registry/get-ship.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAoB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-ship.js","sourceRoot":"","sources":["../../../src/domain/registry/get-ship.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAoB,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAsBnE,oGAAoG;AACpG,MAAM,WAAW,GAAG,CAAC,YAAY,CAAU,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,gBAAgB,EAAE,WAAW,MAAM,gBAAgB,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QACjH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC;YACR,GAAG,MAAM;YACT,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9E,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE;YACvH,kBAAkB,EAAE,MAAM,CAAC,QAAQ;YACnC,cAAc,EAAE,MAAM,CAAC,IAAI;YAC3B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;YACpC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI;SAChD,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { IdGenerator, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type CredentialTx } from '../identity/public.js';
|
|
3
|
+
import type { Caller } 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 GiveBackCrewRequestRefusal } from './crew-request.js';
|
|
10
|
+
import { type LeaseTx } from './leases.js';
|
|
11
|
+
import type { CrewRequestRepository, ShipRepository } from './ports.js';
|
|
12
|
+
export interface GiveBackCrewRequestTx extends LeaseTx, CredentialTx {
|
|
13
|
+
ships: Pick<ShipRepository, 'findForUpdate'>;
|
|
14
|
+
crewRequests: CrewRequestRepository;
|
|
15
|
+
events: EventLog;
|
|
16
|
+
}
|
|
17
|
+
export type GiveBack = (caller: Caller, input: {
|
|
18
|
+
shipId: ShipId;
|
|
19
|
+
settingsVersion: number;
|
|
20
|
+
reason: string;
|
|
21
|
+
}) => Promise<Result<undefined, DomainError<'SHIP_NOT_FOUND'> | GiveBackCrewRequestRefusal>>;
|
|
22
|
+
/**
|
|
23
|
+
* Use case: the trierarch a ship's crew request is assigned to gives it back
|
|
24
|
+
* before its crew is final (#382), so the trierarch plugin places it on
|
|
25
|
+
* another trierarch. Its scope (crew:run) is checked before this runs. In
|
|
26
|
+
* one unit of work, locking the ship first: the request is unassigned and
|
|
27
|
+
* the trierarch recorded, with CrewRequestGivenBack, and the lease its
|
|
28
|
+
* registration holds ends as a release does, its secret invalidated, so the
|
|
29
|
+
* ship awaits crew again. A refusal changes nothing.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createGiveBackCrewRequest(deps: {
|
|
32
|
+
uow: UnitOfWork<GiveBackCrewRequestTx>;
|
|
33
|
+
clock: Clock;
|
|
34
|
+
ids: IdGenerator;
|
|
35
|
+
}): GiveBack;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { revokeShipSecret } from '../identity/public.js';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { recordEvent, shipActor } from '../shared/events.js';
|
|
4
|
+
import { ok } from '../shared/result.js';
|
|
5
|
+
import { giveBackCrewRequest } from './crew-request.js';
|
|
6
|
+
import { endLease } from './leases.js';
|
|
7
|
+
/**
|
|
8
|
+
* Use case: the trierarch a ship's crew request is assigned to gives it back
|
|
9
|
+
* before its crew is final (#382), so the trierarch plugin places it on
|
|
10
|
+
* another trierarch. Its scope (crew:run) is checked before this runs. In
|
|
11
|
+
* one unit of work, locking the ship first: the request is unassigned and
|
|
12
|
+
* the trierarch recorded, with CrewRequestGivenBack, and the lease its
|
|
13
|
+
* registration holds ends as a release does, its secret invalidated, so the
|
|
14
|
+
* ship awaits crew again. A refusal changes nothing.
|
|
15
|
+
*/
|
|
16
|
+
export function createGiveBackCrewRequest(deps) {
|
|
17
|
+
return (caller, input) => deps.uow.run(async (tx) => {
|
|
18
|
+
const { fleetId } = caller;
|
|
19
|
+
const ship = await tx.ships.findForUpdate(fleetId, input.shipId);
|
|
20
|
+
if (!ship) {
|
|
21
|
+
return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
|
|
22
|
+
}
|
|
23
|
+
const at = deps.clock.now();
|
|
24
|
+
const actor = shipActor(caller.shipId);
|
|
25
|
+
const given = giveBackCrewRequest({ ship, current: await tx.crewRequests.find(fleetId, ship.id), trierarchShipId: caller.shipId }, { settingsVersion: input.settingsVersion, reason: input.reason, at, actor });
|
|
26
|
+
if (!given.isOk) {
|
|
27
|
+
return given;
|
|
28
|
+
}
|
|
29
|
+
if (given.value.events.length === 0) {
|
|
30
|
+
return ok(undefined);
|
|
31
|
+
}
|
|
32
|
+
await tx.crewRequests.save(given.value.request);
|
|
33
|
+
for (const event of given.value.events) {
|
|
34
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
35
|
+
}
|
|
36
|
+
await revokeShipSecret({ tx, ids: deps.ids }, { fleetId, shipId: ship.id, actor, at });
|
|
37
|
+
const lease = await tx.leases.findOpenForUpdate(fleetId, ship.id);
|
|
38
|
+
if (lease) {
|
|
39
|
+
await endLease({ tx, ids: deps.ids }, { fleetId, leaseId: lease.id, actor, at, reason: 'released' });
|
|
40
|
+
}
|
|
41
|
+
return ok(undefined);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=give-back-crew-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"give-back-crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/give-back-crew-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAmC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAcrD;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgF;IACxH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA0F,EAAE;QAChH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,mBAAmB,CAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,EAC/F,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAC5E,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -45,6 +45,8 @@ export interface ListedShip {
|
|
|
45
45
|
id: ShipId;
|
|
46
46
|
name: string;
|
|
47
47
|
} | null;
|
|
48
|
+
/** The trierarchs that gave it back before their crew was final, by id and name, oldest first (#382). */
|
|
49
|
+
givenBack: ShipFacts['crewRequestGivenBack'];
|
|
48
50
|
}) | null;
|
|
49
51
|
/** The label values the ship carries, with their labels, by key then value (decision 0031); none for a ship without. */
|
|
50
52
|
labels: readonly CarriedLabel[];
|
|
@@ -73,4 +75,4 @@ export declare function createListFleet(deps: {
|
|
|
73
75
|
listing: FleetListing;
|
|
74
76
|
}): ListFleet;
|
|
75
77
|
/** A ship as the fleet snapshot shows it, from what the listing read about it. */
|
|
76
|
-
export declare function listedShipOf({ ship, openLease, validSecret, crewRequest, crewRequestAssignee, labels, crewedBy, lastPing, lastModel, lastViewedAt, lastLeaseEndedAt, }: ShipFacts): ListedShip;
|
|
78
|
+
export declare function listedShipOf({ ship, openLease, validSecret, crewRequest, crewRequestAssignee, crewRequestGivenBack, labels, crewedBy, lastPing, lastModel, lastViewedAt, lastLeaseEndedAt, }: ShipFacts): ListedShip;
|
|
@@ -11,7 +11,7 @@ export function createListFleet(deps) {
|
|
|
11
11
|
return async (caller, input) => (await deps.listing.ships(caller.fleetId)).filter((facts) => carriesEvery(facts.labels, input?.valueIds)).map(listedShipOf);
|
|
12
12
|
}
|
|
13
13
|
/** A ship as the fleet snapshot shows it, from what the listing read about it. */
|
|
14
|
-
export function listedShipOf({ ship, openLease, validSecret, crewRequest, crewRequestAssignee, labels, crewedBy, lastPing, lastModel, lastViewedAt, lastLeaseEndedAt, }) {
|
|
14
|
+
export function listedShipOf({ ship, openLease, validSecret, crewRequest, crewRequestAssignee, crewRequestGivenBack, labels, crewedBy, lastPing, lastModel, lastViewedAt, lastLeaseEndedAt, }) {
|
|
15
15
|
const status = shipStatus(ship, { isCrewed: openLease !== null });
|
|
16
16
|
return {
|
|
17
17
|
id: ship.id,
|
|
@@ -35,6 +35,7 @@ export function listedShipOf({ ship, openLease, validSecret, crewRequest, crewRe
|
|
|
35
35
|
crewedBy,
|
|
36
36
|
attempt: crewRequest.attempt,
|
|
37
37
|
sessionStartedAt: crewRequest.sessionStartedAt,
|
|
38
|
+
givenBack: crewRequestGivenBack,
|
|
38
39
|
},
|
|
39
40
|
labels,
|
|
40
41
|
harness: openLease?.harness ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/list-fleet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"list-fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/list-fleet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAmDvC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAC7B,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAChI,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAS,EACT,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,gBAAgB,GACN;IACV,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM;QACN,cAAc,EAAE,WAAW,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,KAAK,IAAI,EAAE;QAC5G,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI;QACrC,iGAAiG;QACjG,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,YAAY;QACjD,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QACnE,WAAW,EAAE,WAAW,IAAI;YAC1B,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,UAAU,EAAE,mBAAmB;YAC/B,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,QAAQ;YACR,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,SAAS,EAAE,oBAAoB;SAChC;QACD,MAAM;QACN,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI;QACnC,KAAK,EAAE,SAAS;QAChB,iBAAiB,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;QAChG,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAc;IAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAW,EAAE,MAAmB;IAChD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet's network settings (decision 0034): which ships may send to
|
|
3
|
+
* which. A rule says that the ships matching one label selector may send to
|
|
4
|
+
* the ships matching another; allow-only, no deny rules, no precedence. A
|
|
5
|
+
* fleet holds its rules, or none (all-to-all), with a version that moves on
|
|
6
|
+
* every set, so a refusal names the settings that refused it.
|
|
7
|
+
*/
|
|
8
|
+
import { type FleetId, type LabelValueId, type ShipKind } from '@aeolus-fleet/common';
|
|
9
|
+
import { type DomainError } from '../shared/errors.js';
|
|
10
|
+
import type { Actor, NewEvent } from '../shared/events.js';
|
|
11
|
+
import { type Result } from '../shared/result.js';
|
|
12
|
+
/** The ships carrying every one of these label values may send to the ships carrying every one of those. */
|
|
13
|
+
export interface NetworkRule {
|
|
14
|
+
from: readonly LabelValueId[];
|
|
15
|
+
to: readonly LabelValueId[];
|
|
16
|
+
}
|
|
17
|
+
export interface NetworkSettings {
|
|
18
|
+
fleetId: FleetId;
|
|
19
|
+
/** The rules every send is checked against; none is all-to-all, an empty list allows only the fixed exceptions. */
|
|
20
|
+
rules: readonly NetworkRule[] | null;
|
|
21
|
+
/** 0 until the fleet first sets rules; one more on every set. */
|
|
22
|
+
version: number;
|
|
23
|
+
}
|
|
24
|
+
/** A fleet that never set rules: none, at version 0. */
|
|
25
|
+
export declare function noNetworkSettings(fleetId: FleetId): NetworkSettings;
|
|
26
|
+
export type SetNetworkRulesRefusal = DomainError<'INVALID_NETWORK_RULES'>;
|
|
27
|
+
/**
|
|
28
|
+
* The fleet's rules from now on, replacing the ones it had, at the next
|
|
29
|
+
* version, with NetworkRulesSet. The rules are within the decision's limits:
|
|
30
|
+
* at most 200, each selector at most 20 label values, as a ship carries no
|
|
31
|
+
* more, each once. A value id need not exist: an unknown one matches no ship,
|
|
32
|
+
* as in label selection.
|
|
33
|
+
*/
|
|
34
|
+
export declare function setNetworkRules(current: NetworkSettings, change: {
|
|
35
|
+
rules: readonly NetworkRule[] | null;
|
|
36
|
+
at: Date;
|
|
37
|
+
actor: Actor;
|
|
38
|
+
}): Result<{
|
|
39
|
+
settings: NetworkSettings;
|
|
40
|
+
events: NewEvent[];
|
|
41
|
+
}, SetNetworkRulesRefusal>;
|
|
42
|
+
/** A ship as a send's check sees it: its kind, for the argo exception, and the label values it carries. */
|
|
43
|
+
export interface ReachingShip {
|
|
44
|
+
kind: ShipKind;
|
|
45
|
+
labels: readonly LabelValueId[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether the settings let the sender reach the recipient. With no rules,
|
|
49
|
+
* every ship reaches every ship. The fixed exceptions hold whatever the
|
|
50
|
+
* rules: argo reaches every ship and every ship reaches argo, and a ship
|
|
51
|
+
* answers the sender of a message it received. Otherwise a rule must match
|
|
52
|
+
* the sender with its `from` and the recipient with its `to`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function allowsReach(settings: NetworkSettings, send: {
|
|
55
|
+
sender: ReachingShip;
|
|
56
|
+
recipient: ReachingShip;
|
|
57
|
+
isAnswerToSender: boolean;
|
|
58
|
+
}): boolean;
|