@fougere/core 0.3.0-alpha.0 → 0.5.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/boot/Emissions.js +1 -1
- package/dist/boot/Emissions.js.map +1 -1
- package/dist/boot/HandlerFacade.js +2 -2
- package/dist/boot/HandlerFacade.js.map +1 -1
- package/dist/boot/apply.d.ts.map +1 -1
- package/dist/boot/apply.js +2 -12
- package/dist/boot/apply.js.map +1 -1
- package/dist/boot/binding.d.ts +1 -1
- package/dist/boot/binding.d.ts.map +1 -1
- package/dist/boot/binding.js +4 -4
- package/dist/boot/binding.js.map +1 -1
- package/dist/boot/boot.d.ts +1 -1
- package/dist/boot/boot.d.ts.map +1 -1
- package/dist/boot/bootstrap.d.ts.map +1 -1
- package/dist/boot/bootstrap.js +26 -17
- package/dist/boot/bootstrap.js.map +1 -1
- package/dist/boot/frame.d.ts +1 -1
- package/dist/boot/frame.d.ts.map +1 -1
- package/dist/boot/frame.js +5 -14
- package/dist/boot/frame.js.map +1 -1
- package/dist/boot/hosted.d.ts +29 -0
- package/dist/boot/hosted.d.ts.map +1 -0
- package/dist/boot/hosted.js +38 -0
- package/dist/boot/hosted.js.map +1 -0
- package/dist/boot/ownership.d.ts +0 -3
- package/dist/boot/ownership.d.ts.map +1 -1
- package/dist/boot/ownership.js +5 -5
- package/dist/boot/ownership.js.map +1 -1
- package/dist/boot/remote.d.ts +1 -1
- package/dist/boot/remote.d.ts.map +1 -1
- package/dist/boot/remote.js +3 -3
- package/dist/boot/remote.js.map +1 -1
- package/dist/boot/statement-drift.d.ts +24 -0
- package/dist/boot/statement-drift.d.ts.map +1 -0
- package/dist/boot/statement-drift.js +38 -0
- package/dist/boot/statement-drift.js.map +1 -0
- package/dist/boot/together.d.ts.map +1 -1
- package/dist/boot/together.js +6 -6
- package/dist/boot/together.js.map +1 -1
- package/dist/boot/types.d.ts +17 -4
- package/dist/boot/types.d.ts.map +1 -1
- package/dist/contract/CallLog.d.ts +57 -0
- package/dist/contract/CallLog.d.ts.map +1 -0
- package/dist/contract/CallLog.js +2 -0
- package/dist/contract/CallLog.js.map +1 -0
- package/dist/contract.d.ts +9 -4
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +12 -5
- package/dist/contract.js.map +1 -1
- package/dist/dispatch/DispatchLifecycle.d.ts +9 -1
- package/dist/dispatch/DispatchLifecycle.d.ts.map +1 -1
- package/dist/dispatch/DispatchLifecycle.js +17 -2
- package/dist/dispatch/DispatchLifecycle.js.map +1 -1
- package/dist/dispatch/InFlight.d.ts +0 -1
- package/dist/dispatch/InFlight.d.ts.map +1 -1
- package/dist/dispatch/InFlight.js +0 -3
- package/dist/dispatch/InFlight.js.map +1 -1
- package/dist/dispatch/InputValidator.d.ts.map +1 -1
- package/dist/dispatch/InputValidator.js +3 -2
- package/dist/dispatch/InputValidator.js.map +1 -1
- package/dist/dispatch/OutputProjector.js +2 -2
- package/dist/dispatch/OutputProjector.js.map +1 -1
- package/dist/dispatch/StorageGuard.d.ts.map +1 -1
- package/dist/dispatch/StorageGuard.js +2 -2
- package/dist/dispatch/StorageGuard.js.map +1 -1
- package/dist/effective-operation.d.ts.map +1 -1
- package/dist/effective-operation.js +8 -5
- package/dist/effective-operation.js.map +1 -1
- package/dist/emit.d.ts +2 -2
- package/dist/emit.d.ts.map +1 -1
- package/dist/emit.js +2 -2
- package/dist/emit.js.map +1 -1
- package/dist/identity.js +1 -1
- package/dist/identity.js.map +1 -1
- package/dist/imports.d.ts +1 -1
- package/dist/imports.d.ts.map +1 -1
- package/dist/imports.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -0
- package/dist/node.js.map +1 -1
- package/dist/orm.d.ts.map +1 -1
- package/dist/orm.js +4 -4
- package/dist/orm.js.map +1 -1
- package/dist/prefab/collector.js +2 -2
- package/dist/prefab/collector.js.map +1 -1
- package/dist/prefab/mirror.d.ts.map +1 -1
- package/dist/prefab/mirror.js +2 -2
- package/dist/prefab/mirror.js.map +1 -1
- package/dist/prefab/presenter.d.ts.map +1 -1
- package/dist/prefab/presenter.js +2 -2
- package/dist/prefab/presenter.js.map +1 -1
- package/dist/prefab/repository.d.ts.map +1 -1
- package/dist/prefab/repository.js +2 -2
- package/dist/prefab/repository.js.map +1 -1
- package/dist/scan/bundling.d.ts +14 -0
- package/dist/scan/bundling.d.ts.map +1 -0
- package/dist/scan/bundling.js +26 -0
- package/dist/scan/bundling.js.map +1 -0
- package/dist/scan/declare.d.ts +71 -0
- package/dist/scan/declare.d.ts.map +1 -0
- package/dist/scan/declare.js +125 -0
- package/dist/scan/declare.js.map +1 -0
- package/dist/scan/emit.d.ts.map +1 -1
- package/dist/scan/emit.js +3 -2
- package/dist/scan/emit.js.map +1 -1
- package/dist/scan/handler-parser.d.ts +2 -0
- package/dist/scan/handler-parser.d.ts.map +1 -1
- package/dist/scan/handler-parser.js +52 -13
- package/dist/scan/handler-parser.js.map +1 -1
- package/dist/scan/scanner.d.ts.map +1 -1
- package/dist/scan/scanner.js +37 -11
- package/dist/scan/scanner.js.map +1 -1
- package/dist/scan/statement.d.ts +4 -0
- package/dist/scan/statement.d.ts.map +1 -0
- package/dist/scan/statement.js +112 -0
- package/dist/scan/statement.js.map +1 -0
- package/dist/verify.js +2 -2
- package/dist/verify.js.map +1 -1
- package/dist/wire/call.d.ts +19 -8
- package/dist/wire/call.d.ts.map +1 -1
- package/dist/wire/call.js +17 -6
- package/dist/wire/call.js.map +1 -1
- package/dist/wire/drift.d.ts +55 -0
- package/dist/wire/drift.d.ts.map +1 -0
- package/dist/wire/drift.js +121 -0
- package/dist/wire/drift.js.map +1 -0
- package/dist/wire/middleware.d.ts +1 -1
- package/dist/wire/middleware.d.ts.map +1 -1
- package/package.json +6 -4
- package/src/boot/AppLifecycle.ts +50 -0
- package/src/boot/Emissions.ts +263 -0
- package/src/boot/HandlerFacade.ts +242 -0
- package/src/boot/ambient-port.ts +41 -0
- package/src/boot/ambient.als.ts +43 -0
- package/src/boot/ambient.queue.ts +75 -0
- package/src/boot/apply.ts +47 -0
- package/src/boot/auth.ts +55 -0
- package/src/boot/binding.ts +182 -0
- package/src/boot/boot.ts +125 -0
- package/src/boot/bootstrap.ts +847 -0
- package/src/boot/frame.ts +210 -0
- package/src/boot/hosted.ts +77 -0
- package/src/boot/ownership.ts +137 -0
- package/src/boot/ports.ts +66 -0
- package/src/boot/remote.ts +179 -0
- package/src/boot/seed.ts +158 -0
- package/src/boot/statement-drift.ts +60 -0
- package/src/boot/together.ts +215 -0
- package/src/boot/types.ts +274 -0
- package/src/builtins/config.ts +19 -0
- package/src/builtins/logger.ts +175 -0
- package/src/config-loader.ts +146 -0
- package/src/contract/Call.ts +18 -0
- package/src/contract/CallLog.ts +55 -0
- package/src/contract/Invocation.ts +72 -0
- package/src/contract/RouteAddress.ts +49 -0
- package/src/contract.ts +83 -0
- package/src/crypto/encoding.ts +59 -0
- package/src/crypto/node.ts +30 -0
- package/src/crypto/port.ts +45 -0
- package/src/crypto/webcrypto.ts +55 -0
- package/src/define.ts +10 -0
- package/src/dispatch/ArgumentResolver.ts +17 -0
- package/src/dispatch/ArrayResult.ts +10 -0
- package/src/dispatch/DispatchEvent.ts +38 -0
- package/src/dispatch/DispatchLifecycle.ts +43 -0
- package/src/dispatch/DispatchPort.ts +6 -0
- package/src/dispatch/Dispatcher.ts +48 -0
- package/src/dispatch/InFlight.ts +45 -0
- package/src/dispatch/InputValidator.ts +28 -0
- package/src/dispatch/LocalRoutePolicy.ts +34 -0
- package/src/dispatch/OperationExecutor.ts +60 -0
- package/src/dispatch/OperationRoute.ts +18 -0
- package/src/dispatch/OutputProjector.ts +32 -0
- package/src/dispatch/OutputView.ts +9 -0
- package/src/dispatch/PresenterArgumentResolver.ts +25 -0
- package/src/dispatch/PresenterExecutor.ts +55 -0
- package/src/dispatch/RemoteRouteResolver.ts +21 -0
- package/src/dispatch/Route.ts +11 -0
- package/src/dispatch/RouteNotFoundError.ts +29 -0
- package/src/dispatch/RoutePolicy.ts +8 -0
- package/src/dispatch/RouteRegistry.ts +73 -0
- package/src/dispatch/RouteResolver.ts +7 -0
- package/src/dispatch/StorageGuard.ts +71 -0
- package/src/effective-operation.ts +601 -0
- package/src/emit.ts +90 -0
- package/src/entry/DynamicFacade.ts +28 -0
- package/src/entry/FacadeEntry.ts +32 -0
- package/src/entry/TransportEntry.ts +30 -0
- package/src/frond-config.ts +138 -0
- package/src/graph.ts +180 -0
- package/src/identity-keys.ts +43 -0
- package/src/identity.ts +235 -0
- package/src/imports.ts +123 -0
- package/src/index.ts +120 -0
- package/src/loader.ts +41 -0
- package/src/node.ts +30 -0
- package/src/orm.ts +252 -0
- package/src/prefab/collector.ts +36 -0
- package/src/prefab/crud.ts +188 -0
- package/src/prefab/mirror.ts +122 -0
- package/src/prefab/prefab.ts +46 -0
- package/src/prefab/presenter.ts +63 -0
- package/src/prefab/repository.ts +170 -0
- package/src/scan/Fronds.ts +73 -0
- package/src/scan/bundling.ts +25 -0
- package/src/scan/conventions.ts +122 -0
- package/src/scan/declare.ts +188 -0
- package/src/scan/emit.ts +231 -0
- package/src/scan/frond.ts +235 -0
- package/src/scan/handler-parser.ts +817 -0
- package/src/scan/scanner.ts +757 -0
- package/src/scan/statement.ts +126 -0
- package/src/verify.ts +193 -0
- package/src/wire/call.ts +381 -0
- package/src/wire/drift.ts +131 -0
- package/src/wire/errors.ts +124 -0
- package/src/wire/http-error.ts +77 -0
- package/src/wire/loggerMiddleware.ts +29 -0
- package/src/wire/middleware.ts +47 -0
- package/src/wire/operation.ts +258 -0
- package/dist/boot/Lifecycle.d.ts +0 -4
- package/dist/boot/Lifecycle.d.ts.map +0 -1
- package/dist/boot/Lifecycle.js +0 -3
- package/dist/boot/Lifecycle.js.map +0 -1
- package/dist/boot/egress.d.ts +0 -8
- package/dist/boot/egress.d.ts.map +0 -1
- package/dist/boot/egress.js +0 -11
- package/dist/boot/egress.js.map +0 -1
- package/dist/scan/scan-cache.d.ts +0 -16
- package/dist/scan/scan-cache.d.ts.map +0 -1
- package/dist/scan/scan-cache.js +0 -99
- package/dist/scan/scan-cache.js.map +0 -1
- package/dist/wire/invocation.d.ts +0 -4
- package/dist/wire/invocation.d.ts.map +0 -1
- package/dist/wire/invocation.js +0 -3
- package/dist/wire/invocation.js.map +0 -1
package/dist/wire/call.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* they never reshape it.
|
|
8
8
|
*/
|
|
9
9
|
import { type SchemaDescriptor } from '@fougere/schema';
|
|
10
|
-
import type { InvocationContext } from '
|
|
10
|
+
import type { InvocationContext } from '../contract/Invocation.js';
|
|
11
11
|
import type { App } from '../boot/types.js';
|
|
12
12
|
/** Target of a call — which façade operation, wherever it lives. */
|
|
13
13
|
export interface FrondCall {
|
|
@@ -21,6 +21,17 @@ export interface FrondCall {
|
|
|
21
21
|
/** A transport executes a call somewhere else. Failures surface as thrown FougereError. */
|
|
22
22
|
export type Transport = (call: FrondCall, invocation: InvocationContext) => Promise<unknown>;
|
|
23
23
|
/** Reserved namespace — calls the runner answers itself, never a façade. */
|
|
24
|
+
/**
|
|
25
|
+
* What a receiver accepts before it stops reading a body.
|
|
26
|
+
*
|
|
27
|
+
* Stated once because it was stated FOUR times — `transport/http/policy.ts` said so in its
|
|
28
|
+
* own comment ("spelled in four packages") while three doors kept their own literal, so
|
|
29
|
+
* raising the cap here used to leave three of them refusing at the old one.
|
|
30
|
+
*
|
|
31
|
+
* `@fougere/http` keeps a fourth copy on purpose: it declares no Fougere dependency at all,
|
|
32
|
+
* and giving a leaf port a dependency on the kernel to share a number is the wrong trade.
|
|
33
|
+
*/
|
|
34
|
+
export declare const MAX_BODY_BYTES: number;
|
|
24
35
|
export declare const RPC_ENTITY = "rpc";
|
|
25
36
|
/**
|
|
26
37
|
* What an `rpc` op answers — the door for what the app says about ITSELF, never about a row.
|
|
@@ -80,9 +91,9 @@ export interface CardOp {
|
|
|
80
91
|
* every entry and refused whole cards over a health check.
|
|
81
92
|
*/
|
|
82
93
|
export interface IdentityCard {
|
|
83
|
-
fronds:
|
|
94
|
+
fronds: {
|
|
84
95
|
name: string;
|
|
85
|
-
doors:
|
|
96
|
+
doors: {
|
|
86
97
|
name: string;
|
|
87
98
|
ops: CardOp[];
|
|
88
99
|
/**
|
|
@@ -92,7 +103,7 @@ export interface IdentityCard {
|
|
|
92
103
|
* several shapes. A reader that needs the shape must say what it does without one.
|
|
93
104
|
*/
|
|
94
105
|
schema?: SchemaDescriptor;
|
|
95
|
-
}
|
|
106
|
+
}[];
|
|
96
107
|
/**
|
|
97
108
|
* The facts this frond ANNOUNCES — one entry per `Emit<T>` its handlers inject.
|
|
98
109
|
*
|
|
@@ -110,11 +121,11 @@ export interface IdentityCard {
|
|
|
110
121
|
* requires a fact to be one) and worth saying rather than hiding: the name travels, the
|
|
111
122
|
* shape does not, and a consumer can see exactly that.
|
|
112
123
|
*/
|
|
113
|
-
facts:
|
|
124
|
+
facts: {
|
|
114
125
|
name: string;
|
|
115
126
|
schema?: SchemaDescriptor;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
127
|
+
}[];
|
|
128
|
+
}[];
|
|
118
129
|
}
|
|
119
130
|
/** A frond this process knows about, and whether it runs here. */
|
|
120
131
|
export interface FrondPlacement {
|
|
@@ -158,7 +169,7 @@ export interface TopologyReport {
|
|
|
158
169
|
* card.fronds is not iterable` was what a malformed card produced at the boot,
|
|
159
170
|
* naming neither the remote nor the address.
|
|
160
171
|
*
|
|
161
|
-
* The descriptor behind a door is NOT checked here — `
|
|
172
|
+
* The descriptor behind a door is NOT checked here — `Card.toSchema` refuses it, and
|
|
162
173
|
* only where one is consumed.
|
|
163
174
|
*/
|
|
164
175
|
export declare function assertIdentityCard(value: unknown, source: string): IdentityCard;
|
package/dist/wire/call.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/wire/call.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/wire/call.ts"],"names":[],"mappings":"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"}
|
package/dist/wire/call.js
CHANGED
|
@@ -6,11 +6,22 @@
|
|
|
6
6
|
* runner below is the reference realization. Transports move the value,
|
|
7
7
|
* they never reshape it.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { Card } from '@fougere/schema';
|
|
10
10
|
import { factsAnnouncedBy } from '../emit.js';
|
|
11
11
|
import { FougereError, ErrorCode } from './errors.js';
|
|
12
12
|
import { createTransportEntry } from '../entry/TransportEntry.js';
|
|
13
13
|
/** Reserved namespace — calls the runner answers itself, never a façade. */
|
|
14
|
+
/**
|
|
15
|
+
* What a receiver accepts before it stops reading a body.
|
|
16
|
+
*
|
|
17
|
+
* Stated once because it was stated FOUR times — `transport/http/policy.ts` said so in its
|
|
18
|
+
* own comment ("spelled in four packages") while three doors kept their own literal, so
|
|
19
|
+
* raising the cap here used to leave three of them refusing at the old one.
|
|
20
|
+
*
|
|
21
|
+
* `@fougere/http` keeps a fourth copy on purpose: it declares no Fougere dependency at all,
|
|
22
|
+
* and giving a leaf port a dependency on the kernel to share a number is the wrong trade.
|
|
23
|
+
*/
|
|
24
|
+
export const MAX_BODY_BYTES = 1024 * 1024;
|
|
14
25
|
export const RPC_ENTITY = 'rpc';
|
|
15
26
|
/**
|
|
16
27
|
* The shape a card must have to be walked — `fronds`, and each frond's `doors`.
|
|
@@ -21,7 +32,7 @@ export const RPC_ENTITY = 'rpc';
|
|
|
21
32
|
* card.fronds is not iterable` was what a malformed card produced at the boot,
|
|
22
33
|
* naming neither the remote nor the address.
|
|
23
34
|
*
|
|
24
|
-
* The descriptor behind a door is NOT checked here — `
|
|
35
|
+
* The descriptor behind a door is NOT checked here — `Card.toSchema` refuses it, and
|
|
25
36
|
* only where one is consumed.
|
|
26
37
|
*/
|
|
27
38
|
export function assertIdentityCard(value, source) {
|
|
@@ -112,7 +123,7 @@ export function identityCardOf(app, surface) {
|
|
|
112
123
|
name: address,
|
|
113
124
|
ops,
|
|
114
125
|
// Absent when nothing of that name is stored. A door is still a door.
|
|
115
|
-
...(entity ? { schema:
|
|
126
|
+
...(entity ? { schema: Card.fromSchema(entity.entityClass, address).descriptor } : {}),
|
|
116
127
|
}];
|
|
117
128
|
}),
|
|
118
129
|
/**
|
|
@@ -126,7 +137,7 @@ export function identityCardOf(app, surface) {
|
|
|
126
137
|
*/
|
|
127
138
|
facts: factsAnnouncedBy(frond.handlers).map((name) => {
|
|
128
139
|
const entityClass = declared.get(name);
|
|
129
|
-
return { name, ...(entityClass ? { schema:
|
|
140
|
+
return { name, ...(entityClass ? { schema: Card.fromSchema(entityClass, name).descriptor } : {}) };
|
|
130
141
|
}),
|
|
131
142
|
};
|
|
132
143
|
}),
|
|
@@ -153,8 +164,8 @@ function facadeOps(app, entityName, surface) {
|
|
|
153
164
|
return {
|
|
154
165
|
name,
|
|
155
166
|
...(contract?.description && { description: contract.description }),
|
|
156
|
-
...(contract?.input && { input:
|
|
157
|
-
...(contract?.output && { output:
|
|
167
|
+
...(contract?.input && { input: Card.fromSchema(contract.input, name).descriptor }),
|
|
168
|
+
...(contract?.output && { output: Card.fromSchema(contract.output, name).descriptor }),
|
|
158
169
|
...(contract?.cardinality && { cardinality: contract.cardinality }),
|
|
159
170
|
kind: contract.kind,
|
|
160
171
|
};
|
package/dist/wire/call.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/wire/call.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/wire/call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type Change } from '@fougere/schema';
|
|
2
|
+
import type { IdentityCard } from './call.js';
|
|
3
|
+
/**
|
|
4
|
+
* What separates the copy a consumer holds from what the producer actually serves.
|
|
5
|
+
*
|
|
6
|
+
* It lives beside `IdentityCard` and not in `@fougere/testing` for the reason the card
|
|
7
|
+
* itself does: the subject is the card, and a second reader arrived — the dev panel, which
|
|
8
|
+
* must not drag a 426 KB faker in to compare two of them.
|
|
9
|
+
*/
|
|
10
|
+
export interface CardDrift {
|
|
11
|
+
frond: string;
|
|
12
|
+
/** A door the consumer calls that the producer no longer serves. */
|
|
13
|
+
missingDoors: string[];
|
|
14
|
+
/** An operation the consumer calls that the door no longer has. */
|
|
15
|
+
missingOps: {
|
|
16
|
+
door: string;
|
|
17
|
+
ops: string[];
|
|
18
|
+
}[];
|
|
19
|
+
/** A shape that moved under a door the consumer still calls. */
|
|
20
|
+
shapes: {
|
|
21
|
+
door: string;
|
|
22
|
+
changes: Change[];
|
|
23
|
+
}[];
|
|
24
|
+
/** A fact the consumer subscribes to whose shape moved, or that is gone. */
|
|
25
|
+
facts: {
|
|
26
|
+
fact: string;
|
|
27
|
+
changes: Change[] | 'gone';
|
|
28
|
+
}[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* What a consumer's synced copy no longer matches in what the producer serves.
|
|
32
|
+
*
|
|
33
|
+
* The gap TypeScript cannot see, and the only place the gradient genuinely lies: the code
|
|
34
|
+
* is identical in-process and split, but one side may have aged. `fougere sync` wrote the
|
|
35
|
+
* consumer's copy three weeks ago, the producer moved on, and it still compiles —
|
|
36
|
+
* production is where that is found today. This is what Pact sells; the material was
|
|
37
|
+
* already here, in `rpc.discover` and in `Card.diff`.
|
|
38
|
+
*
|
|
39
|
+
* Read in ONE direction on purpose: what the consumer holds, checked against what is
|
|
40
|
+
* served. A producer serving MORE than the consumer knows is not drift — it is a producer
|
|
41
|
+
* that moved forward without breaking anyone, which is the whole point of the order the
|
|
42
|
+
* repo already states (re-sync the readers, then deploy the sender).
|
|
43
|
+
*/
|
|
44
|
+
export declare function driftOf(mine: IdentityCard, theirs: IdentityCard, frond: string): CardDrift;
|
|
45
|
+
/** Whether anything at all separates the two cards. */
|
|
46
|
+
export declare function agrees(drift: CardDrift): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* The drift, in the words a deploy needs.
|
|
49
|
+
*
|
|
50
|
+
* A fact says the order out loud, because the repo already states it as a rule and
|
|
51
|
+
* nothing enforced it: a fact is judged strictly, so a reader that has not been re-synced
|
|
52
|
+
* refuses what the sender now announces.
|
|
53
|
+
*/
|
|
54
|
+
export declare function explain(drift: CardDrift): string[];
|
|
55
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/wire/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAyB,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mEAAmE;IACnE,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC9C,gEAAgE;IAChE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC9C,4EAA4E;IAC5E,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAgC1F;AAED,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAKhD;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAYlD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Card } from '@fougere/schema';
|
|
2
|
+
/** Every door of a card, by name. */
|
|
3
|
+
function doorsOf(card, frond) {
|
|
4
|
+
const found = new Map();
|
|
5
|
+
for (const one of card.fronds) {
|
|
6
|
+
if (one.name !== frond)
|
|
7
|
+
continue;
|
|
8
|
+
for (const door of one.doors) {
|
|
9
|
+
found.set(door.name, { ops: new Set(door.ops.map((op) => op.name)), schema: door.schema });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return found;
|
|
13
|
+
}
|
|
14
|
+
function factsOf(card, frond) {
|
|
15
|
+
const found = new Map();
|
|
16
|
+
for (const one of card.fronds) {
|
|
17
|
+
if (one.name !== frond)
|
|
18
|
+
continue;
|
|
19
|
+
for (const fact of one.facts ?? [])
|
|
20
|
+
found.set(fact.name, fact.schema);
|
|
21
|
+
}
|
|
22
|
+
return found;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* What a consumer's synced copy no longer matches in what the producer serves.
|
|
26
|
+
*
|
|
27
|
+
* The gap TypeScript cannot see, and the only place the gradient genuinely lies: the code
|
|
28
|
+
* is identical in-process and split, but one side may have aged. `fougere sync` wrote the
|
|
29
|
+
* consumer's copy three weeks ago, the producer moved on, and it still compiles —
|
|
30
|
+
* production is where that is found today. This is what Pact sells; the material was
|
|
31
|
+
* already here, in `rpc.discover` and in `Card.diff`.
|
|
32
|
+
*
|
|
33
|
+
* Read in ONE direction on purpose: what the consumer holds, checked against what is
|
|
34
|
+
* served. A producer serving MORE than the consumer knows is not drift — it is a producer
|
|
35
|
+
* that moved forward without breaking anyone, which is the whole point of the order the
|
|
36
|
+
* repo already states (re-sync the readers, then deploy the sender).
|
|
37
|
+
*/
|
|
38
|
+
export function driftOf(mine, theirs, frond) {
|
|
39
|
+
const held = doorsOf(mine, frond);
|
|
40
|
+
const served = doorsOf(theirs, frond);
|
|
41
|
+
const drift = { frond, missingDoors: [], missingOps: [], shapes: [], facts: [] };
|
|
42
|
+
for (const [name, door] of held) {
|
|
43
|
+
const there = served.get(name);
|
|
44
|
+
if (!there) {
|
|
45
|
+
drift.missingDoors.push(name);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const missing = [...door.ops].filter((op) => !there.ops.has(op));
|
|
49
|
+
if (missing.length > 0)
|
|
50
|
+
drift.missingOps.push({ door: name, ops: missing.sort() });
|
|
51
|
+
if (door.schema && there.schema) {
|
|
52
|
+
// `Card.diff` never guesses a rename — a field gone plus a field appeared lands in
|
|
53
|
+
// `ambiguous`, and only a declaration settles it. Here nobody can declare one, so
|
|
54
|
+
// the pair is reported as it is and a human reads it.
|
|
55
|
+
const moved = Card.fromDescriptor(door.schema).diff(Card.fromDescriptor(there.schema));
|
|
56
|
+
if (moved.changes.length > 0)
|
|
57
|
+
drift.shapes.push({ door: name, changes: moved.changes });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const heldFacts = factsOf(mine, frond);
|
|
61
|
+
const servedFacts = factsOf(theirs, frond);
|
|
62
|
+
for (const [name, shape] of heldFacts) {
|
|
63
|
+
if (!servedFacts.has(name)) {
|
|
64
|
+
drift.facts.push({ fact: name, changes: 'gone' });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const there = servedFacts.get(name);
|
|
68
|
+
if (!shape || !there)
|
|
69
|
+
continue;
|
|
70
|
+
const moved = Card.fromDescriptor(shape).diff(Card.fromDescriptor(there));
|
|
71
|
+
if (moved.changes.length > 0)
|
|
72
|
+
drift.facts.push({ fact: name, changes: moved.changes });
|
|
73
|
+
}
|
|
74
|
+
return drift;
|
|
75
|
+
}
|
|
76
|
+
/** Whether anything at all separates the two cards. */
|
|
77
|
+
export function agrees(drift) {
|
|
78
|
+
return drift.missingDoors.length === 0
|
|
79
|
+
&& drift.missingOps.length === 0
|
|
80
|
+
&& drift.shapes.length === 0
|
|
81
|
+
&& drift.facts.length === 0;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The drift, in the words a deploy needs.
|
|
85
|
+
*
|
|
86
|
+
* A fact says the order out loud, because the repo already states it as a rule and
|
|
87
|
+
* nothing enforced it: a fact is judged strictly, so a reader that has not been re-synced
|
|
88
|
+
* refuses what the sender now announces.
|
|
89
|
+
*/
|
|
90
|
+
export function explain(drift) {
|
|
91
|
+
const lines = [];
|
|
92
|
+
for (const door of drift.missingDoors)
|
|
93
|
+
lines.push(`${drift.frond}.${door} — you call it, it is not served`);
|
|
94
|
+
for (const { door, ops } of drift.missingOps)
|
|
95
|
+
lines.push(`${drift.frond}.${door} — gone: ${ops.join(', ')}`);
|
|
96
|
+
for (const { door, changes } of drift.shapes) {
|
|
97
|
+
for (const change of changes)
|
|
98
|
+
lines.push(`${drift.frond}.${door} — ${describe(change)}`);
|
|
99
|
+
}
|
|
100
|
+
for (const { fact, changes } of drift.facts) {
|
|
101
|
+
if (changes === 'gone') {
|
|
102
|
+
lines.push(`${fact} — you subscribe to it, it is no longer announced`);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
for (const change of changes)
|
|
106
|
+
lines.push(`${fact} — ${describe(change)} → re-sync and deploy the readers, THEN the sender`);
|
|
107
|
+
}
|
|
108
|
+
return lines;
|
|
109
|
+
}
|
|
110
|
+
function describe(change) {
|
|
111
|
+
switch (change.kind) {
|
|
112
|
+
case 'added': return `+ ${change.field}${change.required ? ' (required)' : ''}`;
|
|
113
|
+
case 'removed': return `- ${change.field}`;
|
|
114
|
+
case 'renamed': return `${change.from} → ${change.to}`;
|
|
115
|
+
case 'retyped': return `${change.field}: ${[...change.from].join('|')} → ${[...change.to].join('|')}`;
|
|
116
|
+
case 'reshaped': return `${change.field}: its bounds moved`;
|
|
117
|
+
case 'required': return `${change.field}: ${change.from ? 'no longer' : 'now'} required`;
|
|
118
|
+
case 'restated': return `${change.field}: its ${change.axis} moved`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/wire/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAsC,MAAM,iBAAiB,CAAC;AAsB3E,qCAAqC;AACrC,SAAS,OAAO,CAAC,IAAkB,EAAE,KAAa;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2D,CAAC;IACjF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS;QACjC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAkB,EAAE,KAAa;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS;QACjC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAsC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CAAC,IAAkB,EAAE,MAAoB,EAAE,KAAa;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAc,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAE5F,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAExD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnF,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,mFAAmF;YACnF,kFAAkF;YAClF,sDAAsD;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACvF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;WACjC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;WAC7B,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;WACzB,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,kCAAkC,CAAC,CAAC;IAC5G,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7G,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,mDAAmD,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7G,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChF,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3C,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC;QACvD,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtG,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,oBAAoB,CAAC;QAC5D,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;QACzF,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,SAAS,MAAM,CAAC,IAAI,QAAQ,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -18,7 +18,7 @@ export interface OperationContext {
|
|
|
18
18
|
/** Extensible bag — middlewares deposit data here (user, permissions, etc.). */
|
|
19
19
|
state: Record<string, unknown>;
|
|
20
20
|
/** Transport-agnostic invocation context (params, query, body, state). */
|
|
21
|
-
invocation?: import('
|
|
21
|
+
invocation?: import('../contract/Invocation.js').InvocationContext;
|
|
22
22
|
}
|
|
23
23
|
export type AppNext = () => Promise<unknown>;
|
|
24
24
|
export type AppMiddleware = (ctx: OperationContext, next: AppNext) => Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/wire/middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/wire/middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,2BAA2B,EAAE,iBAAiB,CAAC;CACpE;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAIvF;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,aAAa,EAAE,EAC5B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0-alpha.0",
|
|
4
4
|
"description": "The core — scan, call contract, façades, remote stand-ins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
@@ -50,12 +50,14 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"files": [
|
|
53
|
-
"dist"
|
|
53
|
+
"dist",
|
|
54
|
+
"src"
|
|
54
55
|
],
|
|
55
56
|
"dependencies": {
|
|
56
57
|
"@typescript/typescript6": "^6.0.2",
|
|
57
|
-
"
|
|
58
|
-
"@fougere/container": "0.
|
|
58
|
+
"dequal": "^2.0.3",
|
|
59
|
+
"@fougere/container": "0.5.0-alpha.0",
|
|
60
|
+
"@fougere/schema": "0.5.0-alpha.0"
|
|
59
61
|
},
|
|
60
62
|
"devDependencies": {
|
|
61
63
|
"@types/node": "^22.0.0"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { App } from './types.js';
|
|
2
|
+
|
|
3
|
+
/** One process-level extension and its reversible lifecycle. */
|
|
4
|
+
export interface Extension {
|
|
5
|
+
name: string;
|
|
6
|
+
up?(app: App): void | Promise<void>;
|
|
7
|
+
down?(app: App): void | Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Runs application extensions up in order and down in reverse order. */
|
|
11
|
+
export class AppLifecycle {
|
|
12
|
+
private readonly members: Extension[] = [];
|
|
13
|
+
|
|
14
|
+
add(...extensions: readonly (Extension | undefined)[]): this {
|
|
15
|
+
for (const extension of extensions) {
|
|
16
|
+
if (!extension) continue;
|
|
17
|
+
const at = this.members.findIndex((held) => held.name === extension.name);
|
|
18
|
+
if (at === -1) this.members.push(extension);
|
|
19
|
+
else this.members[at] = extension;
|
|
20
|
+
}
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
names(): string[] {
|
|
25
|
+
return this.members.map((extension) => extension.name);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async up(app: App): Promise<void> {
|
|
29
|
+
for (const extension of this.members) await extension.up?.(app);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async down(app: App): Promise<void> {
|
|
33
|
+
const refused: unknown[] = [];
|
|
34
|
+
for (const extension of [...this.members].reverse()) {
|
|
35
|
+
try {
|
|
36
|
+
await extension.down?.(app);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
refused.push(error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (refused.length > 0) {
|
|
42
|
+
throw new AggregateError(refused, `${refused.length} extension(s) refused to release`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The replaceable migration slot of the application lifecycle. */
|
|
48
|
+
export function migrating(migrate?: Extension['up']): Extension {
|
|
49
|
+
return migrate ? { name: 'migrate', up: migrate } : { name: 'migrate' };
|
|
50
|
+
}
|