@mantaq/core 0.2.0 → 0.4.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 +158 -113
- package/dist/index.d.mts +237 -71
- package/dist/index.mjs +1 -766
- package/package.json +5 -5
- package/dist/actor-internal-B4iAxUG_.d.mts +0 -152
- package/dist/internal.d.mts +0 -26
- package/dist/internal.mjs +0 -31
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mantaq/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "State machine runtime with actor model, event system, state hierarchy, effects, and virtual clock.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
"dist"
|
|
13
13
|
],
|
|
14
14
|
"type": "module",
|
|
15
|
+
"sideEffects": false,
|
|
15
16
|
"exports": {
|
|
16
17
|
".": "./dist/index.mjs",
|
|
17
|
-
"./internal": "./dist/internal.mjs",
|
|
18
18
|
"./package.json": "./package.json"
|
|
19
19
|
},
|
|
20
20
|
"publishConfig": {
|
|
21
21
|
"access": "public"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mantaq/utils": "0.0.
|
|
24
|
+
"@mantaq/utils": "0.0.4"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@stryker-mutator/core": "^9",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"@types/node": "^26.2.0",
|
|
30
30
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
31
31
|
"@vitest/coverage-v8": "4.1.10",
|
|
32
|
-
"typescript": "
|
|
32
|
+
"typescript": "6.0.3",
|
|
33
33
|
"vite": "npm:@voidzero-dev/vite-plus-core@0.2.8",
|
|
34
34
|
"vite-plus": "0.2.8",
|
|
35
35
|
"vitest": "4.1.10",
|
|
36
|
-
"@mantaq/pbt": "0.0.
|
|
36
|
+
"@mantaq/pbt": "0.0.3"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "vp pack",
|
|
@@ -1,152 +0,0 @@
|
|
|
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>(type: T): <Payload extends object | void = void>() => EventRef<T, Payload>;
|
|
24
|
-
type AnyEventRef = EventRef<string, object | void>;
|
|
25
|
-
type InternalEvent = {
|
|
26
|
-
type: string;
|
|
27
|
-
payload?: unknown;
|
|
28
|
-
};
|
|
29
|
-
type CreatedOfEvent<T extends string, P> = P extends void ? {
|
|
30
|
-
type: T;
|
|
31
|
-
} : {
|
|
32
|
-
type: T;
|
|
33
|
-
payload: P;
|
|
34
|
-
};
|
|
35
|
-
declare class EventRef<const T extends string, Payload extends object | void = void> {
|
|
36
|
-
readonly type: T;
|
|
37
|
-
constructor(type: T);
|
|
38
|
-
is(anyEvent: unknown): anyEvent is CreatedOfEvent<T, Payload>;
|
|
39
|
-
create(): Payload extends void ? {
|
|
40
|
-
type: T;
|
|
41
|
-
} : void;
|
|
42
|
-
create(payload: Payload): Payload extends void ? {
|
|
43
|
-
type: T;
|
|
44
|
-
} : {
|
|
45
|
-
type: T;
|
|
46
|
-
payload: Payload;
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region src/clock.d.ts
|
|
51
|
-
interface Clock {
|
|
52
|
-
setTimeout(ms: number, cb: () => void, options?: {
|
|
53
|
-
signal?: AbortSignal;
|
|
54
|
-
eventName?: string;
|
|
55
|
-
}): number;
|
|
56
|
-
clearTimeout(id: number): void;
|
|
57
|
-
setInterval(ms: number, cb: () => void, options?: {
|
|
58
|
-
signal?: AbortSignal;
|
|
59
|
-
}): number;
|
|
60
|
-
clearInterval(id: number): void;
|
|
61
|
-
now(): number;
|
|
62
|
-
/** Optional hook for draining queues after clock advances (VirtualClock). */
|
|
63
|
-
setDrain?(fn: () => void): void;
|
|
64
|
-
}
|
|
65
|
-
//#endregion
|
|
66
|
-
//#region src/context.d.ts
|
|
67
|
-
declare class Context<T> {
|
|
68
|
-
#private;
|
|
69
|
-
constructor(get: () => T, set: (value: T) => void);
|
|
70
|
-
get(): T;
|
|
71
|
-
set(value: T): void;
|
|
72
|
-
}
|
|
73
|
-
//#endregion
|
|
74
|
-
//#region src/actor-types.d.ts
|
|
75
|
-
type CreatedOf<E extends AnyEventRef> = E extends EventRef<infer Type, infer P> ? CreatedOfEvent<Type, P> : never;
|
|
76
|
-
type NonFinalStateRef<States extends AnyStateRef[]> = Extract<States[number], {
|
|
77
|
-
isFinal: false;
|
|
78
|
-
}>;
|
|
79
|
-
interface EffectInput<ActorContext, Payload = unknown> {
|
|
80
|
-
signal: AbortSignal;
|
|
81
|
-
state: {
|
|
82
|
-
name: string;
|
|
83
|
-
payload: Payload;
|
|
84
|
-
};
|
|
85
|
-
event: InternalEvent;
|
|
86
|
-
context: Context<ActorContext>;
|
|
87
|
-
emit: (event: InternalEvent) => void;
|
|
88
|
-
clock: Clock;
|
|
89
|
-
}
|
|
90
|
-
type EffectFn<ActorContext, Payload = unknown> = (input: EffectInput<ActorContext, Payload>) => void | Promise<void>;
|
|
91
|
-
type ErrorReason = "transition" | "effect" | "budget" | "output" | "internal" | "async" | "unhandled";
|
|
92
|
-
interface ErrorInfo {
|
|
93
|
-
error: unknown;
|
|
94
|
-
state: AnyStateRef;
|
|
95
|
-
context: unknown;
|
|
96
|
-
event: InternalEvent;
|
|
97
|
-
reason: ErrorReason;
|
|
98
|
-
}
|
|
99
|
-
interface TransitionInfo {
|
|
100
|
-
event: InternalEvent;
|
|
101
|
-
from: string;
|
|
102
|
-
to: string;
|
|
103
|
-
transitioned: boolean;
|
|
104
|
-
}
|
|
105
|
-
type ErrorState = StateRef<"__error", unknown, true>;
|
|
106
|
-
type TransitionResult<AllowedState extends AnyStateRef = AnyStateRef, AllowedEmit extends string = string> = {
|
|
107
|
-
state?: AllowedState | {
|
|
108
|
-
state: AllowedState;
|
|
109
|
-
payload?: unknown;
|
|
110
|
-
};
|
|
111
|
-
payload?: unknown;
|
|
112
|
-
emit?: Array<{
|
|
113
|
-
type: AllowedEmit;
|
|
114
|
-
payload?: unknown;
|
|
115
|
-
}>;
|
|
116
|
-
};
|
|
117
|
-
//#endregion
|
|
118
|
-
//#region src/actor-internal.d.ts
|
|
119
|
-
interface Snapshot<C = unknown> {
|
|
120
|
-
path: string[];
|
|
121
|
-
context: C;
|
|
122
|
-
payload?: unknown;
|
|
123
|
-
regions: Record<string, Snapshot<unknown>>;
|
|
124
|
-
done?: boolean;
|
|
125
|
-
error?: ErrorInfo;
|
|
126
|
-
}
|
|
127
|
-
interface AnyActor<C = Record<string, unknown>> {
|
|
128
|
-
state: AnyStateRef;
|
|
129
|
-
clock: Clock;
|
|
130
|
-
regions: Record<string, AnyActor>;
|
|
131
|
-
send(event: AnyEventRef | InternalEvent): void;
|
|
132
|
-
snapshot(): Snapshot<C>;
|
|
133
|
-
on(event: "change", fn: (snapshot: Snapshot<C>, prev: Snapshot<C>) => void): () => void;
|
|
134
|
-
on(event: "done", fn: () => void): () => void;
|
|
135
|
-
on(event: "transition", fn: (info: TransitionInfo) => void): () => void;
|
|
136
|
-
recover(target: {
|
|
137
|
-
state: AnyStateRef;
|
|
138
|
-
context: C;
|
|
139
|
-
}): void;
|
|
140
|
-
settled(): Promise<void>;
|
|
141
|
-
context?: C;
|
|
142
|
-
options?: {
|
|
143
|
-
transitions?: Record<string, Record<string, unknown>>;
|
|
144
|
-
effects?: Record<string, unknown[]>;
|
|
145
|
-
states?: ReadonlyArray<{
|
|
146
|
-
name: string;
|
|
147
|
-
isFinal: boolean;
|
|
148
|
-
}>;
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
//#endregion
|
|
152
|
-
export { InternalEvent as _, EffectInput as a, StateRef as b, ErrorState as c, TransitionResult as d, Context as f, EventRef as g, CreatedOfEvent as h, EffectFn as i, NonFinalStateRef as l, AnyEventRef as m, Snapshot as n, ErrorInfo as o, Clock as p, CreatedOf as r, ErrorReason as s, AnyActor as t, TransitionInfo as u, event as v, state as x, AnyStateRef as y };
|
package/dist/internal.d.mts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { _ as InternalEvent, t as AnyActor } from "./actor-internal-B4iAxUG_.mjs";
|
|
2
|
-
import { Either } from "@mantaq/utils";
|
|
3
|
-
//#region src/internal-registry.d.ts
|
|
4
|
-
interface ActorInternal {
|
|
5
|
-
children: Map<string, AnyActor>;
|
|
6
|
-
getOutputHandler(): ((event: InternalEvent) => void) | null;
|
|
7
|
-
setOutputHandler(fn: ((event: InternalEvent) => void) | null): void;
|
|
8
|
-
pushInternal(event: InternalEvent): void;
|
|
9
|
-
drainInternal(): void;
|
|
10
|
-
abortEffects(): void;
|
|
11
|
-
}
|
|
12
|
-
interface RegistryError {
|
|
13
|
-
message: string;
|
|
14
|
-
}
|
|
15
|
-
declare global {
|
|
16
|
-
var __mantaqCoreInternalRegistry: WeakMap<object, ActorInternal> | undefined;
|
|
17
|
-
}
|
|
18
|
-
declare function registerActor(actor: object, internal: ActorInternal): void;
|
|
19
|
-
declare function getChildren(actor: object): Either<RegistryError, Map<string, AnyActor>>;
|
|
20
|
-
declare function getOutputHandler(actor: object): Either<RegistryError, ((event: InternalEvent) => void) | null>;
|
|
21
|
-
declare function setOutputHandler(actor: object, fn: ((event: InternalEvent) => void) | null): Either<RegistryError, void>;
|
|
22
|
-
declare function pushInternal(actor: object, event: InternalEvent): Either<RegistryError, void>;
|
|
23
|
-
declare function drainInternal(actor: object): Either<RegistryError, void>;
|
|
24
|
-
declare function abortEffects(actor: object): Either<RegistryError, void>;
|
|
25
|
-
//#endregion
|
|
26
|
-
export { ActorInternal, RegistryError, abortEffects, drainInternal, getChildren, getOutputHandler, pushInternal, registerActor, setOutputHandler };
|
package/dist/internal.mjs
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Either } from "@mantaq/utils";
|
|
2
|
-
//#region src/internal-registry.ts
|
|
3
|
-
const registry = globalThis.__mantaqCoreInternalRegistry ??= /* @__PURE__ */ new WeakMap();
|
|
4
|
-
const UNREGISTERED = { message: "[mantaq] actor is not registered with the internal registry" };
|
|
5
|
-
function withInternal(actor, fn) {
|
|
6
|
-
const internal = registry.get(actor);
|
|
7
|
-
return internal === void 0 ? Either.left(UNREGISTERED) : [void 0, fn(internal)];
|
|
8
|
-
}
|
|
9
|
-
function registerActor(actor, internal) {
|
|
10
|
-
registry.set(actor, internal);
|
|
11
|
-
}
|
|
12
|
-
function getChildren(actor) {
|
|
13
|
-
return withInternal(actor, (internal) => internal.children);
|
|
14
|
-
}
|
|
15
|
-
function getOutputHandler(actor) {
|
|
16
|
-
return withInternal(actor, (internal) => internal.getOutputHandler());
|
|
17
|
-
}
|
|
18
|
-
function setOutputHandler(actor, fn) {
|
|
19
|
-
return withInternal(actor, (internal) => internal.setOutputHandler(fn));
|
|
20
|
-
}
|
|
21
|
-
function pushInternal(actor, event) {
|
|
22
|
-
return withInternal(actor, (internal) => internal.pushInternal(event));
|
|
23
|
-
}
|
|
24
|
-
function drainInternal(actor) {
|
|
25
|
-
return withInternal(actor, (internal) => internal.drainInternal());
|
|
26
|
-
}
|
|
27
|
-
function abortEffects(actor) {
|
|
28
|
-
return withInternal(actor, (internal) => internal.abortEffects());
|
|
29
|
-
}
|
|
30
|
-
//#endregion
|
|
31
|
-
export { abortEffects, drainInternal, getChildren, getOutputHandler, pushInternal, registerActor, setOutputHandler };
|