@mantaq/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +657 -0
- package/dist/actor-internal-CfZDmHJ3.d.mts +89 -0
- package/dist/index.d.mts +151 -0
- package/dist/index.mjs +557 -0
- package/dist/internal.d.mts +26 -0
- package/dist/internal.mjs +31 -0
- package/package.json +45 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//#region src/state.d.ts
|
|
2
|
+
declare function state<const T extends string>(id: T): <Payload = unknown>() => StateRef<T, Payload, false>;
|
|
3
|
+
type AnyStateRef = StateRef<string, unknown, boolean>;
|
|
4
|
+
interface RegionOptions {
|
|
5
|
+
initial: string;
|
|
6
|
+
states: Record<string, AnyStateRef>;
|
|
7
|
+
}
|
|
8
|
+
type RegionsOptions = Record<string, RegionOptions>;
|
|
9
|
+
declare class StateRef<T extends string, Payload = unknown, IsFinal extends boolean = false> {
|
|
10
|
+
readonly name: T;
|
|
11
|
+
readonly isFinal: IsFinal;
|
|
12
|
+
/** @internal */ _regions: RegionsOptions | undefined;
|
|
13
|
+
constructor(name: T, isFinal: IsFinal);
|
|
14
|
+
regions(options: RegionsOptions): this;
|
|
15
|
+
final(): StateRef<T, Payload, true>;
|
|
16
|
+
create(payload: Payload): {
|
|
17
|
+
state: StateRef<T, Payload, IsFinal>;
|
|
18
|
+
payload: Payload;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/event.d.ts
|
|
23
|
+
declare function event<const T extends string>(id: T): <Payload extends object | void = void>() => EventRef<T, Payload>;
|
|
24
|
+
type AnyEventRef = EventRef<string, object | void>;
|
|
25
|
+
type InternalEvent = {
|
|
26
|
+
id: string;
|
|
27
|
+
} & Record<string, unknown>;
|
|
28
|
+
type CreatedOfEvent<Id extends string, P> = P extends void ? {
|
|
29
|
+
id: Id;
|
|
30
|
+
} : P & {
|
|
31
|
+
id: Id;
|
|
32
|
+
};
|
|
33
|
+
declare class EventRef<const T extends string, Payload extends object | void = void> {
|
|
34
|
+
readonly id: T;
|
|
35
|
+
constructor(id: T);
|
|
36
|
+
is(anyEvent: unknown): anyEvent is CreatedOfEvent<T, Payload>;
|
|
37
|
+
create(): Payload extends void ? {
|
|
38
|
+
id: T;
|
|
39
|
+
} : void;
|
|
40
|
+
create(payload: Payload): Payload extends void ? {
|
|
41
|
+
id: T;
|
|
42
|
+
} : Payload & {
|
|
43
|
+
id: T;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/clock.d.ts
|
|
48
|
+
interface Clock {
|
|
49
|
+
setTimeout(ms: number, cb: () => void, options?: {
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
eventName?: string;
|
|
52
|
+
}): number;
|
|
53
|
+
clearTimeout(id: number): void;
|
|
54
|
+
setInterval(ms: number, cb: () => void, options?: {
|
|
55
|
+
signal?: AbortSignal;
|
|
56
|
+
}): number;
|
|
57
|
+
clearInterval(id: number): void;
|
|
58
|
+
now(): number;
|
|
59
|
+
/** Optional hook for draining queues after clock advances (VirtualClock). */
|
|
60
|
+
setDrain?(fn: () => void): void;
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/actor-internal.d.ts
|
|
64
|
+
interface Snapshot {
|
|
65
|
+
path: string[];
|
|
66
|
+
regions: Record<string, Snapshot>;
|
|
67
|
+
done?: boolean;
|
|
68
|
+
}
|
|
69
|
+
interface AnyActor {
|
|
70
|
+
state: AnyStateRef;
|
|
71
|
+
clock: Clock;
|
|
72
|
+
regions: Record<string, AnyActor>;
|
|
73
|
+
send(event: AnyEventRef | InternalEvent): void;
|
|
74
|
+
snapshot(): Snapshot;
|
|
75
|
+
on(event: "change", fn: (snapshot: Snapshot) => void): () => void;
|
|
76
|
+
on(event: "done", fn: () => void): () => void;
|
|
77
|
+
settled(): Promise<void>;
|
|
78
|
+
context?: Record<string, unknown>;
|
|
79
|
+
options?: {
|
|
80
|
+
transitions?: Record<string, Record<string, unknown>>;
|
|
81
|
+
effects?: Record<string, unknown[]>;
|
|
82
|
+
states?: ReadonlyArray<{
|
|
83
|
+
name: string;
|
|
84
|
+
isFinal: boolean;
|
|
85
|
+
}>;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { CreatedOfEvent as a, event as c, state as d, AnyEventRef as i, AnyStateRef as l, Snapshot as n, EventRef as o, Clock as r, InternalEvent as s, AnyActor as t, StateRef as u };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { a as CreatedOfEvent, c as event, d as state, i as AnyEventRef, l as AnyStateRef, n as Snapshot, o as EventRef, r as Clock, s as InternalEvent, t as AnyActor, u as StateRef } from "./actor-internal-CfZDmHJ3.mjs";
|
|
2
|
+
//#region src/real-clock.d.ts
|
|
3
|
+
declare class RealClock implements Clock {
|
|
4
|
+
#private;
|
|
5
|
+
now(): number;
|
|
6
|
+
setTimeout(ms: number, cb: () => void, options?: {
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
eventName?: string;
|
|
9
|
+
}): number;
|
|
10
|
+
clearTimeout(id: number): void;
|
|
11
|
+
setInterval(ms: number, cb: () => void, options?: {
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}): number;
|
|
14
|
+
clearInterval(id: number): void;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/virtual-clock.d.ts
|
|
18
|
+
declare class VirtualClock implements Clock {
|
|
19
|
+
#private;
|
|
20
|
+
now(): number;
|
|
21
|
+
setTimeout(ms: number, cb: () => void, options?: {
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
eventName?: string;
|
|
24
|
+
}): number;
|
|
25
|
+
clearTimeout(id: number): void;
|
|
26
|
+
setInterval(ms: number, cb: () => void, options?: {
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}): number;
|
|
29
|
+
clearInterval(id: number): void;
|
|
30
|
+
advance(ms: number): void;
|
|
31
|
+
hasPending(): boolean;
|
|
32
|
+
pendingTimers(): Array<{
|
|
33
|
+
id: number;
|
|
34
|
+
deadline: number;
|
|
35
|
+
ms: number;
|
|
36
|
+
eventName?: string;
|
|
37
|
+
}>;
|
|
38
|
+
setDrain(fn: () => void): void;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/actor-types.d.ts
|
|
42
|
+
type CreatedOf<E extends AnyEventRef> = E extends EventRef<infer Id, infer P> ? CreatedOfEvent<Id, P> : never;
|
|
43
|
+
type NonFinalStateRef<States extends AnyStateRef[]> = Extract<States[number], {
|
|
44
|
+
isFinal: false;
|
|
45
|
+
}>;
|
|
46
|
+
interface EffectInput<ActorContext> {
|
|
47
|
+
signal: AbortSignal;
|
|
48
|
+
state: {
|
|
49
|
+
name: string;
|
|
50
|
+
payload: unknown;
|
|
51
|
+
};
|
|
52
|
+
event: InternalEvent;
|
|
53
|
+
context: ActorContext;
|
|
54
|
+
emit: (event: InternalEvent) => void;
|
|
55
|
+
clock: Clock;
|
|
56
|
+
}
|
|
57
|
+
type EffectFn<ActorContext> = (input: EffectInput<ActorContext>) => void;
|
|
58
|
+
type TransitionResult<AllowedState extends AnyStateRef = AnyStateRef, AllowedEmit extends string = string> = {
|
|
59
|
+
state?: AllowedState | {
|
|
60
|
+
state: AllowedState;
|
|
61
|
+
payload?: unknown;
|
|
62
|
+
};
|
|
63
|
+
payload?: unknown;
|
|
64
|
+
emit?: Array<{
|
|
65
|
+
id: AllowedEmit;
|
|
66
|
+
}>;
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/builder.d.ts
|
|
70
|
+
type EventIdOf<E extends AnyEventRef> = E extends EventRef<infer Id, object | void> ? Id : never;
|
|
71
|
+
type TransitionHandler<States extends readonly AnyStateRef[], ActorContext> = (event: InternalEvent, opts: {
|
|
72
|
+
context: ActorContext;
|
|
73
|
+
actor: AnyActor;
|
|
74
|
+
}) => TransitionResult<States[number], string>;
|
|
75
|
+
interface BuiltMaps<States extends readonly AnyStateRef[], ActorContext> {
|
|
76
|
+
transitions: Record<string, Record<string, TransitionHandler<States, ActorContext>>>;
|
|
77
|
+
effects: Record<string, Array<EffectFn<ActorContext>>>;
|
|
78
|
+
}
|
|
79
|
+
declare class ActorBuilder<States extends readonly AnyStateRef[], Inputs extends readonly AnyEventRef[], Internal extends readonly AnyEventRef[], Outputs extends readonly AnyEventRef[], ActorContext> {
|
|
80
|
+
#private;
|
|
81
|
+
on<S extends States[number], E extends Inputs[number] | Internal[number]>(stateRef: S, eventRef: E, fn: (event: E extends EventRef<infer Id, infer P> ? CreatedOfEvent<Id, P> : never, opts: {
|
|
82
|
+
context: ActorContext;
|
|
83
|
+
actor: AnyActor;
|
|
84
|
+
}) => TransitionResult<States[number], EventIdOf<Outputs[number]>>): this;
|
|
85
|
+
onAny<E extends Inputs[number] | Internal[number]>(eventRef: E, fn: (event: E extends EventRef<infer Id, infer P> ? CreatedOfEvent<Id, P> : never, opts: {
|
|
86
|
+
context: ActorContext;
|
|
87
|
+
actor: AnyActor;
|
|
88
|
+
}) => TransitionResult<States[number], EventIdOf<Outputs[number]>>): this;
|
|
89
|
+
effect<S extends States[number]>(stateRef: S, fn: EffectFn<ActorContext>): this;
|
|
90
|
+
/** @internal */ build(): BuiltMaps<States, ActorContext>;
|
|
91
|
+
}
|
|
92
|
+
type SetupFn<States extends readonly AnyStateRef[], Inputs extends readonly AnyEventRef[], Internal extends readonly AnyEventRef[], Outputs extends readonly AnyEventRef[], ActorContext> = (m: ActorBuilder<States, Inputs, Internal, Outputs, ActorContext>) => void;
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region src/actor.d.ts
|
|
95
|
+
type CreatedOf$1<E extends AnyEventRef> = E extends EventRef<infer Id, infer P> ? (P extends void ? {
|
|
96
|
+
id: Id;
|
|
97
|
+
} : P & {
|
|
98
|
+
id: Id;
|
|
99
|
+
}) : never;
|
|
100
|
+
type InitialState<S extends AnyStateRef> = S extends StateRef<infer _N extends string, infer P> ? [unknown] extends [P] ? S | {
|
|
101
|
+
state: S;
|
|
102
|
+
payload?: P;
|
|
103
|
+
} : {
|
|
104
|
+
state: S;
|
|
105
|
+
payload: P;
|
|
106
|
+
} : never;
|
|
107
|
+
interface ActorOptions<States extends readonly AnyStateRef[], Inputs extends readonly AnyEventRef[], Internal extends readonly AnyEventRef[], Outputs extends readonly AnyEventRef[], ActorContext = Record<string, unknown>> {
|
|
108
|
+
inputs: Inputs;
|
|
109
|
+
outputs?: Outputs;
|
|
110
|
+
internal?: Internal;
|
|
111
|
+
states: States;
|
|
112
|
+
context?: ActorContext;
|
|
113
|
+
initial: InitialState<States[number]>;
|
|
114
|
+
clock?: Clock;
|
|
115
|
+
internalBudget?: number;
|
|
116
|
+
setup: SetupFn<States, Inputs, Internal, Outputs, ActorContext>;
|
|
117
|
+
regions?: Record<string, AnyActor>;
|
|
118
|
+
}
|
|
119
|
+
interface InternalActorOptions<States extends readonly AnyStateRef[], Inputs extends readonly AnyEventRef[], Internal extends readonly AnyEventRef[], Outputs extends readonly AnyEventRef[], ActorContext = Record<string, unknown>> {
|
|
120
|
+
inputs: Inputs;
|
|
121
|
+
outputs?: Outputs;
|
|
122
|
+
internal?: Internal;
|
|
123
|
+
states: States;
|
|
124
|
+
context?: ActorContext;
|
|
125
|
+
initial: InitialState<States[number]>;
|
|
126
|
+
clock?: Clock;
|
|
127
|
+
internalBudget?: number;
|
|
128
|
+
transitions: TransitionDispatch<States, ActorContext>;
|
|
129
|
+
effects: Record<string, Array<EffectFn<ActorContext>>>;
|
|
130
|
+
regions?: Record<string, AnyActor>;
|
|
131
|
+
}
|
|
132
|
+
type TransitionDispatch<States extends readonly AnyStateRef[], ActorContext> = Record<string, Record<string, ((event: InternalEvent, options: {
|
|
133
|
+
context: ActorContext;
|
|
134
|
+
actor: AnyActor;
|
|
135
|
+
}) => TransitionResult<States[number], string>) | undefined>>;
|
|
136
|
+
declare class Actor<const States extends readonly AnyStateRef[], const Inputs extends readonly AnyEventRef[], const Internal extends readonly AnyEventRef[] = readonly [], const Outputs extends readonly AnyEventRef[] = readonly [], ActorContext = Record<string, unknown>> {
|
|
137
|
+
#private;
|
|
138
|
+
state: States[number];
|
|
139
|
+
readonly clock: Clock;
|
|
140
|
+
get context(): ActorContext;
|
|
141
|
+
get regions(): Record<string, AnyActor>;
|
|
142
|
+
get options(): InternalActorOptions<States, Inputs, Internal, Outputs, ActorContext>;
|
|
143
|
+
constructor(options: ActorOptions<States, Inputs, Internal, Outputs, ActorContext>);
|
|
144
|
+
on(event: "change", fn: (snapshot: Snapshot) => void): () => void;
|
|
145
|
+
on(event: "done", fn: () => void): () => void;
|
|
146
|
+
settled(): Promise<void>;
|
|
147
|
+
send(event: CreatedOf$1<Inputs[number]>): void;
|
|
148
|
+
snapshot(): Snapshot;
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
export { Actor, type ActorBuilder, type AnyActor, type AnyEventRef, type AnyStateRef, type Clock, type CreatedOf, type CreatedOfEvent, type EffectFn, type EffectInput, EventRef, type InternalEvent, type NonFinalStateRef, RealClock, type SetupFn, type Snapshot, StateRef, VirtualClock, event, state };
|