stitchkit 0.80.0 → 0.80.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.
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const RevisionSignalStateSchema: z.ZodEnum<{
|
|
3
|
+
closed: "closed";
|
|
4
|
+
open: "open";
|
|
5
|
+
}>;
|
|
6
|
+
export type RevisionSignalState = z.infer<typeof RevisionSignalStateSchema>;
|
|
7
|
+
export declare const RevisionSignalWaitOutcomeSchema: z.ZodEnum<{
|
|
8
|
+
aborted: "aborted";
|
|
9
|
+
capacity: "capacity";
|
|
10
|
+
changed: "changed";
|
|
11
|
+
closed: "closed";
|
|
12
|
+
"timed-out": "timed-out";
|
|
13
|
+
}>;
|
|
14
|
+
export type RevisionSignalWaitOutcome = z.infer<typeof RevisionSignalWaitOutcomeSchema>;
|
|
15
|
+
export declare const RevisionSignalWaitResultSchema: z.ZodReadonly<z.ZodObject<{
|
|
16
|
+
outcome: z.ZodEnum<{
|
|
17
|
+
aborted: "aborted";
|
|
18
|
+
capacity: "capacity";
|
|
19
|
+
changed: "changed";
|
|
20
|
+
closed: "closed";
|
|
21
|
+
"timed-out": "timed-out";
|
|
22
|
+
}>;
|
|
23
|
+
revision: z.ZodNumber;
|
|
24
|
+
}, z.core.$strict>>;
|
|
25
|
+
export type RevisionSignalWaitResult = z.infer<typeof RevisionSignalWaitResultSchema>;
|
|
26
|
+
export declare const RevisionSignalAdvanceResultSchema: z.ZodReadonly<z.ZodObject<{
|
|
27
|
+
outcome: z.ZodEnum<{
|
|
28
|
+
advanced: "advanced";
|
|
29
|
+
closed: "closed";
|
|
30
|
+
}>;
|
|
31
|
+
revision: z.ZodNumber;
|
|
32
|
+
}, z.core.$strict>>;
|
|
33
|
+
export type RevisionSignalAdvanceResult = z.infer<typeof RevisionSignalAdvanceResultSchema>;
|
|
34
|
+
export declare const RevisionSignalSnapshotSchema: z.ZodReadonly<z.ZodObject<{
|
|
35
|
+
state: z.ZodEnum<{
|
|
36
|
+
closed: "closed";
|
|
37
|
+
open: "open";
|
|
38
|
+
}>;
|
|
39
|
+
revision: z.ZodNumber;
|
|
40
|
+
pending: z.ZodNumber;
|
|
41
|
+
maxWaiters: z.ZodNumber;
|
|
42
|
+
advances: z.ZodNumber;
|
|
43
|
+
refusedAdvances: z.ZodNumber;
|
|
44
|
+
waits: z.ZodNumber;
|
|
45
|
+
changed: z.ZodNumber;
|
|
46
|
+
timedOut: z.ZodNumber;
|
|
47
|
+
aborted: z.ZodNumber;
|
|
48
|
+
closedWaits: z.ZodNumber;
|
|
49
|
+
capacityRefusals: z.ZodNumber;
|
|
50
|
+
clockFailures: z.ZodNumber;
|
|
51
|
+
}, z.core.$strict>>;
|
|
52
|
+
export type RevisionSignalSnapshot = z.infer<typeof RevisionSignalSnapshotSchema>;
|
|
53
|
+
export interface RevisionSignalTimer {
|
|
54
|
+
cancel(): void;
|
|
55
|
+
}
|
|
56
|
+
/** Timer boundary for deterministic wait-budget tests. */
|
|
57
|
+
export interface RevisionSignalClock {
|
|
58
|
+
schedule(callback: () => void, delayMs: number): RevisionSignalTimer;
|
|
59
|
+
}
|
|
60
|
+
export interface RevisionSignalConfig {
|
|
61
|
+
/** Maximum simultaneously parked waits. */
|
|
62
|
+
readonly maxWaiters: number;
|
|
63
|
+
/** Defaults to the platform timer. */
|
|
64
|
+
readonly clock?: RevisionSignalClock;
|
|
65
|
+
}
|
|
66
|
+
export interface RevisionSignalWaitOptions {
|
|
67
|
+
readonly signal?: AbortSignal;
|
|
68
|
+
/** Absent means wait until an advance, abort or close. */
|
|
69
|
+
readonly timeoutMs?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface RevisionSignal {
|
|
72
|
+
/** Advance the monotonic revision and broadcast it to every older waiter. */
|
|
73
|
+
advance(): RevisionSignalAdvanceResult;
|
|
74
|
+
/**
|
|
75
|
+
* Wait for a revision newer than `after`.
|
|
76
|
+
*
|
|
77
|
+
* An already newer revision resolves immediately. The current revision parks the wait. A
|
|
78
|
+
* future revision is a caller bug and is rejected before any waiter is retained.
|
|
79
|
+
*/
|
|
80
|
+
wait(after: number, options?: RevisionSignalWaitOptions): Promise<RevisionSignalWaitResult>;
|
|
81
|
+
close(): RevisionSignalSnapshot;
|
|
82
|
+
getSnapshot(): RevisionSignalSnapshot;
|
|
83
|
+
}
|
|
84
|
+
/** Finite process-local broadcast wake-up keyed by a monotonic revision. */
|
|
85
|
+
export declare function createRevisionSignal(config: RevisionSignalConfig): RevisionSignal;
|
|
86
|
+
//# sourceMappingURL=revision-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-signal.d.ts","sourceRoot":"","sources":["../../src/application/revision-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;EAA6B,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,+BAA+B;;;;;;EAM1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,8BAA8B;;;;;;;;;mBAM9B,CAAC;AACd,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,iCAAiC;;;;;;mBAMjC,CAAC;AACd,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;mBAiB5B,CAAC;AACd,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACtE;AAED,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,IAAI,2BAA2B,CAAC;IACvC;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC5F,KAAK,IAAI,sBAAsB,CAAC;IAChC,WAAW,IAAI,sBAAsB,CAAC;CACvC;AAaD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAoHjF"}
|
package/dist/application.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export { defineKeyspace, type KeyspaceBackend, type KeyspaceChange, type Keyspac
|
|
|
10
10
|
export { type SqliteKeyspaceBackendConfig, sqliteKeyspaceBackend, } from './application/keyspace-sqlite.js';
|
|
11
11
|
export { type ApplicationSnapshotSink, type ApplicationSnapshotSinkConfig, type ApplicationSnapshotSinkError, type ApplicationSnapshotSinkStatus, ApplicationSnapshotSinkStatusSchema, createApplicationSnapshotSink, type RevisionedApplicationSnapshot, } from './application/latest-sink.js';
|
|
12
12
|
export { defineManagedResource, type ManagedResource, type ManagedResourceContext, type ManagedResourceDependency, type ManagedResourcePublished, type ManagedResourcePublishesNoValue, type ManagedResourceStartResult, managedResourceDependencyId, } from './application/resource.js';
|
|
13
|
+
export { createRevisionSignal, type RevisionSignal, type RevisionSignalAdvanceResult, RevisionSignalAdvanceResultSchema, type RevisionSignalClock, type RevisionSignalConfig, type RevisionSignalSnapshot, RevisionSignalSnapshotSchema, type RevisionSignalState, RevisionSignalStateSchema, type RevisionSignalTimer, type RevisionSignalWaitOptions, type RevisionSignalWaitOutcome, RevisionSignalWaitOutcomeSchema, type RevisionSignalWaitResult, RevisionSignalWaitResultSchema, } from './application/revision-signal.js';
|
|
13
14
|
export { createManagedSchedule, type ManagedSchedule, type ManagedScheduleClock, type ManagedScheduleConfig, type ManagedScheduleDescriptor, ManagedScheduleDescriptorSchema, type ManagedScheduleErrorPolicy, ManagedScheduleErrorPolicySchema, type ManagedScheduleOverlap, ManagedScheduleOverlapSchema, type ManagedScheduleRunContext, type ManagedScheduleStatus, ManagedScheduleStatusSchema, type ManagedScheduleTimer, } from './application/schedule.js';
|
|
14
15
|
export { type ManagedServerResource, type ManagedServerResourceConfig, managedServerResource, } from './application/server-resource.js';
|
|
15
16
|
export { type AttachedWatcher, createWatchHub, type WatchHub, type WatchHubConfig, type WatchOperation, type WatchSubscriber, watchKey, } from './application/watch-hub.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
|
package/dist/application.js
CHANGED
|
@@ -778,6 +778,167 @@ function sqliteKeyspaceBackend(declaration, config) {
|
|
|
778
778
|
}
|
|
779
779
|
};
|
|
780
780
|
}
|
|
781
|
+
// src/application/revision-signal.ts
|
|
782
|
+
import { z as z5 } from "zod";
|
|
783
|
+
var NonNegativeSafeIntegerSchema = z5.number().int().nonnegative().safe();
|
|
784
|
+
var PositiveSafeIntegerSchema2 = z5.number().int().positive().safe();
|
|
785
|
+
var TimerDelaySchema = z5.number().int().positive().max(2147483647);
|
|
786
|
+
var RevisionSignalStateSchema = z5.enum(["open", "closed"]);
|
|
787
|
+
var RevisionSignalWaitOutcomeSchema = z5.enum([
|
|
788
|
+
"changed",
|
|
789
|
+
"timed-out",
|
|
790
|
+
"aborted",
|
|
791
|
+
"closed",
|
|
792
|
+
"capacity"
|
|
793
|
+
]);
|
|
794
|
+
var RevisionSignalWaitResultSchema = z5.object({
|
|
795
|
+
outcome: RevisionSignalWaitOutcomeSchema,
|
|
796
|
+
revision: NonNegativeSafeIntegerSchema
|
|
797
|
+
}).strict().readonly();
|
|
798
|
+
var RevisionSignalAdvanceResultSchema = z5.object({
|
|
799
|
+
outcome: z5.enum(["advanced", "closed"]),
|
|
800
|
+
revision: NonNegativeSafeIntegerSchema
|
|
801
|
+
}).strict().readonly();
|
|
802
|
+
var RevisionSignalSnapshotSchema = z5.object({
|
|
803
|
+
state: RevisionSignalStateSchema,
|
|
804
|
+
revision: NonNegativeSafeIntegerSchema,
|
|
805
|
+
pending: NonNegativeSafeIntegerSchema,
|
|
806
|
+
maxWaiters: PositiveSafeIntegerSchema2,
|
|
807
|
+
advances: NonNegativeSafeIntegerSchema,
|
|
808
|
+
refusedAdvances: NonNegativeSafeIntegerSchema,
|
|
809
|
+
waits: NonNegativeSafeIntegerSchema,
|
|
810
|
+
changed: NonNegativeSafeIntegerSchema,
|
|
811
|
+
timedOut: NonNegativeSafeIntegerSchema,
|
|
812
|
+
aborted: NonNegativeSafeIntegerSchema,
|
|
813
|
+
closedWaits: NonNegativeSafeIntegerSchema,
|
|
814
|
+
capacityRefusals: NonNegativeSafeIntegerSchema,
|
|
815
|
+
clockFailures: NonNegativeSafeIntegerSchema
|
|
816
|
+
}).strict().readonly();
|
|
817
|
+
var systemClock = {
|
|
818
|
+
schedule(callback, delayMs) {
|
|
819
|
+
const timer = setTimeout(callback, delayMs);
|
|
820
|
+
return { cancel: () => clearTimeout(timer) };
|
|
821
|
+
}
|
|
822
|
+
};
|
|
823
|
+
function createRevisionSignal(config) {
|
|
824
|
+
const maxWaiters = PositiveSafeIntegerSchema2.parse(config.maxWaiters);
|
|
825
|
+
const clock = config.clock ?? systemClock;
|
|
826
|
+
const waiters = new Set;
|
|
827
|
+
let state = "open";
|
|
828
|
+
let revision = 0;
|
|
829
|
+
let advances = 0;
|
|
830
|
+
let refusedAdvances = 0;
|
|
831
|
+
let waits = 0;
|
|
832
|
+
let changed = 0;
|
|
833
|
+
let timedOut = 0;
|
|
834
|
+
let aborted = 0;
|
|
835
|
+
let closedWaits = 0;
|
|
836
|
+
let capacityRefusals = 0;
|
|
837
|
+
let clockFailures = 0;
|
|
838
|
+
const result = (outcome) => {
|
|
839
|
+
if (outcome === "changed")
|
|
840
|
+
changed += 1;
|
|
841
|
+
else if (outcome === "timed-out")
|
|
842
|
+
timedOut += 1;
|
|
843
|
+
else if (outcome === "aborted")
|
|
844
|
+
aborted += 1;
|
|
845
|
+
else if (outcome === "closed")
|
|
846
|
+
closedWaits += 1;
|
|
847
|
+
else
|
|
848
|
+
capacityRefusals += 1;
|
|
849
|
+
return RevisionSignalWaitResultSchema.parse({ outcome, revision });
|
|
850
|
+
};
|
|
851
|
+
const snapshot = () => RevisionSignalSnapshotSchema.parse({
|
|
852
|
+
state,
|
|
853
|
+
revision,
|
|
854
|
+
pending: waiters.size,
|
|
855
|
+
maxWaiters,
|
|
856
|
+
advances,
|
|
857
|
+
refusedAdvances,
|
|
858
|
+
waits,
|
|
859
|
+
changed,
|
|
860
|
+
timedOut,
|
|
861
|
+
aborted,
|
|
862
|
+
closedWaits,
|
|
863
|
+
capacityRefusals,
|
|
864
|
+
clockFailures
|
|
865
|
+
});
|
|
866
|
+
return {
|
|
867
|
+
advance() {
|
|
868
|
+
if (state === "closed") {
|
|
869
|
+
refusedAdvances += 1;
|
|
870
|
+
return RevisionSignalAdvanceResultSchema.parse({ outcome: "closed", revision });
|
|
871
|
+
}
|
|
872
|
+
if (revision === Number.MAX_SAFE_INTEGER) {
|
|
873
|
+
throw new RangeError("Revision signal exhausted the safe-integer revision range");
|
|
874
|
+
}
|
|
875
|
+
revision += 1;
|
|
876
|
+
advances += 1;
|
|
877
|
+
for (const waiter of [...waiters])
|
|
878
|
+
waiter.settle("changed");
|
|
879
|
+
return RevisionSignalAdvanceResultSchema.parse({ outcome: "advanced", revision });
|
|
880
|
+
},
|
|
881
|
+
wait(after, options = {}) {
|
|
882
|
+
const parsedAfter = NonNegativeSafeIntegerSchema.parse(after);
|
|
883
|
+
const timeoutMs = options.timeoutMs === undefined ? undefined : TimerDelaySchema.parse(options.timeoutMs);
|
|
884
|
+
if (parsedAfter > revision) {
|
|
885
|
+
throw new RangeError(`Revision signal cannot wait after future revision ${parsedAfter}; current revision is ${revision}`);
|
|
886
|
+
}
|
|
887
|
+
waits += 1;
|
|
888
|
+
if (state === "closed")
|
|
889
|
+
return Promise.resolve(result("closed"));
|
|
890
|
+
if (parsedAfter < revision)
|
|
891
|
+
return Promise.resolve(result("changed"));
|
|
892
|
+
if (options.signal?.aborted)
|
|
893
|
+
return Promise.resolve(result("aborted"));
|
|
894
|
+
if (waiters.size >= maxWaiters)
|
|
895
|
+
return Promise.resolve(result("capacity"));
|
|
896
|
+
return new Promise((resolve) => {
|
|
897
|
+
let settled = false;
|
|
898
|
+
let timer;
|
|
899
|
+
const waiter = {
|
|
900
|
+
settle(outcome) {
|
|
901
|
+
if (settled)
|
|
902
|
+
return;
|
|
903
|
+
settled = true;
|
|
904
|
+
timer?.cancel();
|
|
905
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
906
|
+
waiters.delete(waiter);
|
|
907
|
+
resolve(result(outcome));
|
|
908
|
+
}
|
|
909
|
+
};
|
|
910
|
+
function onAbort() {
|
|
911
|
+
waiter.settle("aborted");
|
|
912
|
+
}
|
|
913
|
+
waiters.add(waiter);
|
|
914
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
915
|
+
if (timeoutMs !== undefined) {
|
|
916
|
+
try {
|
|
917
|
+
const scheduled = clock.schedule(() => waiter.settle("timed-out"), timeoutMs);
|
|
918
|
+
timer = scheduled;
|
|
919
|
+
if (settled)
|
|
920
|
+
scheduled.cancel();
|
|
921
|
+
} catch (error) {
|
|
922
|
+
settled = true;
|
|
923
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
924
|
+
waiters.delete(waiter);
|
|
925
|
+
clockFailures += 1;
|
|
926
|
+
throw error;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
});
|
|
930
|
+
},
|
|
931
|
+
close() {
|
|
932
|
+
if (state === "closed")
|
|
933
|
+
return snapshot();
|
|
934
|
+
state = "closed";
|
|
935
|
+
for (const waiter of [...waiters])
|
|
936
|
+
waiter.settle("closed");
|
|
937
|
+
return snapshot();
|
|
938
|
+
},
|
|
939
|
+
getSnapshot: snapshot
|
|
940
|
+
};
|
|
941
|
+
}
|
|
781
942
|
// src/application/server-resource.ts
|
|
782
943
|
function managedServerResource(config) {
|
|
783
944
|
let shutdownPromise;
|
|
@@ -1092,6 +1253,7 @@ export {
|
|
|
1092
1253
|
defineManagedResource,
|
|
1093
1254
|
defineKeyspace,
|
|
1094
1255
|
createWatchHub,
|
|
1256
|
+
createRevisionSignal,
|
|
1095
1257
|
createManagedSchedule,
|
|
1096
1258
|
createDecisionPipeline,
|
|
1097
1259
|
createCreditWindow,
|
|
@@ -1104,6 +1266,11 @@ export {
|
|
|
1104
1266
|
createApplication,
|
|
1105
1267
|
createActivityProjection,
|
|
1106
1268
|
applicationLifecycleEvent,
|
|
1269
|
+
RevisionSignalWaitResultSchema,
|
|
1270
|
+
RevisionSignalWaitOutcomeSchema,
|
|
1271
|
+
RevisionSignalStateSchema,
|
|
1272
|
+
RevisionSignalSnapshotSchema,
|
|
1273
|
+
RevisionSignalAdvanceResultSchema,
|
|
1107
1274
|
PolicyDecisionSchema,
|
|
1108
1275
|
ManagedScheduleStatusSchema,
|
|
1109
1276
|
ManagedScheduleOverlapSchema,
|
package/llms-full.txt
CHANGED
|
@@ -5153,7 +5153,7 @@ description: Compose process-local resources, schedules, readiness, drain and op
|
|
|
5153
5153
|
type: architecture
|
|
5154
5154
|
status: active
|
|
5155
5155
|
created: 2026-08-23
|
|
5156
|
-
updated: 2026-
|
|
5156
|
+
updated: 2026-09-04 14:11 +07:00
|
|
5157
5157
|
---
|
|
5158
5158
|
|
|
5159
5159
|
# Managed application kernel
|
|
@@ -5663,6 +5663,40 @@ underlying Promise actually settles. `drain()` therefore reports real work;
|
|
|
5663
5663
|
`force()` closes admission and reports remaining work without claiming to have
|
|
5664
5664
|
terminated it. → ADR 0118.
|
|
5665
5665
|
|
|
5666
|
+
### Bounded revision wake-up
|
|
5667
|
+
|
|
5668
|
+
Use `createRevisionSignal` when several operations need to wait for the same
|
|
5669
|
+
process-local fact to change, but the change itself is not a queue item:
|
|
5670
|
+
|
|
5671
|
+
```ts
|
|
5672
|
+
const connectionsChanged = createRevisionSignal({ maxWaiters: 256 })
|
|
5673
|
+
|
|
5674
|
+
const observed = connectionsChanged.getSnapshot().revision
|
|
5675
|
+
const result = await connectionsChanged.wait(observed, {
|
|
5676
|
+
signal: request.signal,
|
|
5677
|
+
timeoutMs: 10_000,
|
|
5678
|
+
})
|
|
5679
|
+
|
|
5680
|
+
// After changing the canonical connection state:
|
|
5681
|
+
connectionsChanged.advance()
|
|
5682
|
+
```
|
|
5683
|
+
|
|
5684
|
+
`wait(after)` resolves immediately when the signal is already newer than
|
|
5685
|
+
`after`; this closes the race between reading a snapshot and registering the
|
|
5686
|
+
wait. Waiting on the current revision parks one operation, up to `maxWaiters`.
|
|
5687
|
+
Every terminal result carries the revision it observed and distinguishes
|
|
5688
|
+
`changed`, `timed-out`, `aborted`, `closed` and `capacity`. A future `after` is
|
|
5689
|
+
a caller error rather than a revision the signal could honestly promise to
|
|
5690
|
+
reach.
|
|
5691
|
+
|
|
5692
|
+
One advance wakes every older waiter. It is not consumed by the first reader,
|
|
5693
|
+
does not retain event payloads and has no replay history. A bounded channel is
|
|
5694
|
+
for delivering items to one reader; a credit window grants a finite resource.
|
|
5695
|
+
|
|
5696
|
+
The signal is already its whole lifecycle handle. Call its idempotent `close()`
|
|
5697
|
+
from the `close` phase of the managed resource that owns the changing fact;
|
|
5698
|
+
there is no second managed-resource wrapper around the same state. → ADR 0163.
|
|
5699
|
+
|
|
5666
5700
|
### Bounded delivery and byte credit
|
|
5667
5701
|
|
|
5668
5702
|
`createBoundedChannel` is for one asynchronous reader when an event bus is not a
|
|
@@ -13775,6 +13809,19 @@ cutovers are covered by the executable
|
|
|
13775
13809
|
| `BoundedAdmissionRefusalError` | class | `run()` refusal with reason and optional `retryAfterMs` |
|
|
13776
13810
|
| `BoundedOperationWaitError` | class | caller wait ended as `cancelled` or `timed-out`; underlying capacity remains leased until work settles |
|
|
13777
13811
|
|
|
13812
|
+
### Revision wake-up
|
|
13813
|
+
|
|
13814
|
+
| Export | Kind | Summary |
|
|
13815
|
+
|--------|------|---------|
|
|
13816
|
+
| `createRevisionSignal` | function | finite broadcast wait for the next monotonic process-local revision |
|
|
13817
|
+
| `RevisionSignal` / `RevisionSignalConfig` / `RevisionSignalClock` / `RevisionSignalTimer` | _type_ | signal handle, waiter bound and replaceable timer boundary |
|
|
13818
|
+
| `RevisionSignalWaitOptions` | _type_ | optional caller `signal` and positive `timeoutMs`; absent options wait until advance or close |
|
|
13819
|
+
| `RevisionSignalWaitOutcomeSchema` / `RevisionSignalWaitOutcome` | schema / _type_ | `changed \| timed-out \| aborted \| closed \| capacity` |
|
|
13820
|
+
| `RevisionSignalWaitResultSchema` / `RevisionSignalWaitResult` | schema / _type_ | terminal wait outcome with the revision observed at settlement |
|
|
13821
|
+
| `RevisionSignalAdvanceResultSchema` / `RevisionSignalAdvanceResult` | schema / _type_ | successful `advanced` or post-close `closed`, with the resulting revision |
|
|
13822
|
+
| `RevisionSignalStateSchema` / `RevisionSignalState` | schema / _type_ | `open \| closed` lifecycle |
|
|
13823
|
+
| `RevisionSignalSnapshotSchema` / `RevisionSignalSnapshot` | schema / _type_ | current revision, finite pending count and lifetime outcome counters |
|
|
13824
|
+
|
|
13778
13825
|
### Bounded delivery
|
|
13779
13826
|
|
|
13780
13827
|
| Export | Kind | Summary |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stitchkit",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.1",
|
|
4
4
|
"description": "Contract-first backend framework — one defineContract() into an HTTP API, MCP tools, AI-agent tools and a typed client. Bun and Node.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
"check": "bun x tsc --noEmit",
|
|
171
171
|
"build:js": "bun run build:entrypoints && bun scripts/preserve-webpack-ignore.mjs",
|
|
172
172
|
"build:types": "bun x tsc -p tsconfig.build.json --emitDeclarationOnly && bun scripts/rewrite-declaration-specifiers.mjs",
|
|
173
|
-
"build": "rm -rf dist && bun run build:js && bun run build:types && bun scripts/check-browser-clean.mjs && bun scripts/check-browser-executes.mjs && bun scripts/check-env-live.mjs && bun scripts/check-public-types.mjs",
|
|
173
|
+
"build": "rm -rf dist && bun run build:js && bun run build:types && bun scripts/check-browser-clean.mjs && bun scripts/check-browser-executes.mjs && bun scripts/check-env-live.mjs && bun scripts/check-public-types.mjs && bun scripts/check-declarations-strict.mjs",
|
|
174
174
|
"dev": "bun run build:entrypoints -- --watch",
|
|
175
175
|
"prepack": "cp ../../README.md ./README.md && bun ../../scripts/gen-llms.ts && bun run build",
|
|
176
176
|
"test": "bun test",
|