durable-actors 0.8.0 → 0.8.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/README.md +1 -1
- package/dist/actor/actor.d.ts +19 -11
- package/dist/actor/actor.d.ts.map +1 -1
- package/dist/actor/actor.js +41 -36
- package/dist/actor/actor.js.map +1 -1
- package/dist/actor/alarm.d.ts +19 -0
- package/dist/actor/alarm.d.ts.map +1 -0
- package/dist/actor/alarm.js +2 -0
- package/dist/actor/alarm.js.map +1 -0
- package/dist/actor/context.d.ts +25 -0
- package/dist/actor/context.d.ts.map +1 -0
- package/dist/actor/context.js +83 -0
- package/dist/actor/context.js.map +1 -0
- package/dist/actor/database.d.ts +5 -5
- package/dist/actor/database.d.ts.map +1 -1
- package/dist/actor/database.js +9 -37
- package/dist/actor/database.js.map +1 -1
- package/dist/actor/decorators.d.ts +7 -2
- package/dist/actor/decorators.d.ts.map +1 -1
- package/dist/actor/decorators.js +11 -2
- package/dist/actor/decorators.js.map +1 -1
- package/dist/actor/resource.d.ts +9 -0
- package/dist/actor/resource.d.ts.map +1 -0
- package/dist/actor/resource.js +2 -0
- package/dist/actor/resource.js.map +1 -0
- package/dist/actor/schema.d.ts +3 -1
- package/dist/actor/schema.d.ts.map +1 -1
- package/dist/actor/schema.js.map +1 -1
- package/dist/actor/unchecked.d.ts +12 -0
- package/dist/actor/unchecked.d.ts.map +1 -0
- package/dist/actor/unchecked.js +8 -0
- package/dist/actor/unchecked.js.map +1 -0
- package/dist/cli/inspect.d.ts +73 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +132 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/client-runtime/http.d.ts +1 -1
- package/dist/client-runtime/http.d.ts.map +1 -1
- package/dist/client-runtime/http.js +1 -1
- package/dist/client-runtime/http.js.map +1 -1
- package/dist/client-runtime/stub.d.ts.map +1 -1
- package/dist/client-runtime/stub.js +11 -1
- package/dist/client-runtime/stub.js.map +1 -1
- package/dist/compiler/actor-compiler.d.ts +4 -2
- package/dist/compiler/actor-compiler.d.ts.map +1 -1
- package/dist/compiler/actor-compiler.js +48 -13
- package/dist/compiler/actor-compiler.js.map +1 -1
- package/dist/compiler/declarations.d.ts.map +1 -1
- package/dist/compiler/declarations.js +31 -1
- package/dist/compiler/declarations.js.map +2 -2
- package/dist/compiler/features/atomicity.d.ts +9 -0
- package/dist/compiler/features/atomicity.d.ts.map +1 -0
- package/dist/compiler/features/atomicity.js +44 -0
- package/dist/compiler/features/atomicity.js.map +1 -0
- package/dist/compiler/features/interleave.d.ts +9 -0
- package/dist/compiler/features/{reentrancy.d.ts.map → interleave.d.ts.map} +1 -1
- package/dist/compiler/features/{reentrancy.js → interleave.js} +13 -13
- package/dist/compiler/features/{reentrancy.js.map → interleave.js.map} +1 -1
- package/dist/compiler/features/persistence.d.ts +2 -5
- package/dist/compiler/features/persistence.d.ts.map +1 -1
- package/dist/compiler/features/persistence.js +5 -83
- package/dist/compiler/features/persistence.js.map +1 -1
- package/dist/compiler/features/resource.d.ts +5 -0
- package/dist/compiler/features/resource.d.ts.map +1 -0
- package/dist/compiler/features/resource.js +18 -0
- package/dist/compiler/features/resource.js.map +1 -0
- package/dist/compiler/fieldParsing.d.ts +12 -0
- package/dist/compiler/fieldParsing.d.ts.map +1 -0
- package/dist/compiler/fieldParsing.js +106 -0
- package/dist/compiler/fieldParsing.js.map +1 -0
- package/dist/compiler/json-schema.d.ts +2 -2
- package/dist/compiler/json-schema.d.ts.map +1 -1
- package/dist/compiler/json-schema.js +22 -14
- package/dist/compiler/json-schema.js.map +1 -1
- package/dist/compiler/rpc-contract.d.ts +1 -1
- package/dist/compiler/rpc-contract.d.ts.map +1 -1
- package/dist/compiler/rpc-contract.js +21 -11
- package/dist/compiler/rpc-contract.js.map +1 -1
- package/dist/compiler/socket-contract.d.ts +1 -1
- package/dist/compiler/socket-contract.d.ts.map +1 -1
- package/dist/compiler/socket-contract.js +3 -3
- package/dist/compiler/socket-contract.js.map +1 -1
- package/dist/compiler/types.d.ts +13 -3
- package/dist/compiler/types.d.ts.map +1 -1
- package/dist/compiler/types.js +3 -1
- package/dist/compiler/types.js.map +1 -1
- package/dist/compiler/validate-public-contract.d.ts.map +1 -1
- package/dist/compiler/validate-public-contract.js +12 -1
- package/dist/compiler/validate-public-contract.js.map +1 -1
- package/dist/generated/client-runtime.d.ts.map +1 -1
- package/dist/generated/client-runtime.js +1 -1
- package/dist/generated/client-runtime.js.map +1 -1
- package/dist/host/actor-host.d.ts.map +1 -1
- package/dist/host/actor-host.js +44 -50
- package/dist/host/actor-host.js.map +1 -1
- package/dist/host/actor-runtime.d.ts +7 -8
- package/dist/host/actor-runtime.d.ts.map +1 -1
- package/dist/host/actor-runtime.js +80 -78
- package/dist/host/actor-runtime.js.map +1 -1
- package/dist/host/actor-worker.js +10 -27
- package/dist/host/actor-worker.js.map +1 -1
- package/dist/host/database-bridge.d.ts +16 -0
- package/dist/host/database-bridge.d.ts.map +1 -0
- package/dist/host/database-bridge.js +29 -0
- package/dist/host/database-bridge.js.map +1 -0
- package/dist/host/database.d.ts +86 -0
- package/dist/host/database.d.ts.map +1 -0
- package/dist/host/database.js +87 -0
- package/dist/host/database.js.map +1 -0
- package/dist/host/generic-host.js +1 -1
- package/dist/host/persisted-fields.d.ts +7 -0
- package/dist/host/persisted-fields.d.ts.map +1 -0
- package/dist/host/persisted-fields.js +29 -0
- package/dist/host/persisted-fields.js.map +1 -0
- package/dist/host/protocol.d.ts +55 -131
- package/dist/host/protocol.d.ts.map +1 -1
- package/dist/host/protocol.js +28 -28
- package/dist/host/protocol.js.map +1 -1
- package/dist/host/types.d.ts +8 -9
- package/dist/host/types.d.ts.map +1 -1
- package/dist/host/worker-supervisor.d.ts +32 -30
- package/dist/host/worker-supervisor.d.ts.map +1 -1
- package/dist/host/worker-supervisor.js +246 -230
- package/dist/host/worker-supervisor.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/templates/actor/package.json +1 -1
- package/dist/templates/ai-chat/package.json +1 -1
- package/dist/templates/ai-chat/src/actors.ts +1 -1
- package/dist/templates/chat/package.json +1 -1
- package/dist/templates/chat/src/actors.ts +1 -1
- package/dist/templates/documents/package.json +1 -1
- package/dist/templates/documents/src/actors.ts +1 -1
- package/package.json +2 -2
- package/dist/compiler/features/reentrancy.d.ts +0 -9
- package/dist/host/sqlite.d.ts +0 -49
- package/dist/host/sqlite.d.ts.map +0 -1
- package/dist/host/sqlite.js +0 -161
- package/dist/host/sqlite.js.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ cd my-actors
|
|
|
14
14
|
bun install
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Define `src/actors.ts`. Fields marked `@Persisted` survive restarts. They share one SQLite database and transaction with `this.db` SQL.
|
|
17
|
+
Define `src/actors.ts`. Fields marked `@Persisted` survive restarts. They share one SQLite database and transaction with `this.db` SQL. The Rust runtime owns the database and replicates it with Litestream; local development persists to the filesystem.
|
|
18
18
|
|
|
19
19
|
```ts
|
|
20
20
|
import { Actor, Persisted } from "durable-actors"
|
package/dist/actor/actor.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { JsonObject, JsonValue } from "../json.js";
|
|
2
|
+
import type { ActorAlarm } from "./alarm.js";
|
|
3
|
+
import type { ActorContext } from "./context.js";
|
|
4
|
+
import { RuntimeActorContext } from "./context.js";
|
|
2
5
|
import type { ActorDatabase } from "./database.js";
|
|
3
6
|
import type { ActorSchema } from "./schema.js";
|
|
4
7
|
import type { ActorBroadcastOptions, ActorConnection, ActorSocket } from "./socket.js";
|
|
5
8
|
import type { ActorSchemas } from "./socketValidation.js";
|
|
6
9
|
declare const actorTypes: unique symbol;
|
|
10
|
+
declare let actorContext: (value: object) => RuntimeActorContext | undefined;
|
|
7
11
|
interface Actor<Metadata = JsonValue, Incoming = JsonValue, Outgoing = Incoming, Tag extends string = string> {
|
|
8
12
|
/** Accepts a joining connection on success. Call `socket.reject(4003, reason)` to deny it. */
|
|
9
13
|
onConnect?(socket: ActorSocket<Metadata, Outgoing, Tag>): Promise<void>;
|
|
@@ -11,16 +15,20 @@ interface Actor<Metadata = JsonValue, Incoming = JsonValue, Outgoing = Incoming,
|
|
|
11
15
|
onMessage?(socket: ActorSocket<Metadata, Outgoing, Tag>, message: Incoming): Promise<void>;
|
|
12
16
|
/** Runs after disconnection; may be skipped on server failure. */
|
|
13
17
|
onDisconnect?(socket: ActorSocket<Metadata, Outgoing, Tag>, code: number, reason: string, wasClean: boolean): Promise<void>;
|
|
18
|
+
/** Runs when the actor's scheduled alarm becomes due. The alarm is cleared afterward unless this callback sets a new one. */
|
|
19
|
+
onAlarm?(): Promise<void>;
|
|
14
20
|
}
|
|
15
21
|
/**
|
|
16
|
-
* Base class for durable actors. Extend directly
|
|
22
|
+
* Base class for durable actors. Extend directly; explicit constructors must pass their `ActorContext` to `super`.
|
|
17
23
|
* Application methods must be async; instance fields require `@Persisted` or `@Ephemeral`.
|
|
24
|
+
* Initialized private `ActorResource` fields are implicitly ephemeral.
|
|
18
25
|
* @typeParam Metadata - Connection metadata supplied by the backend.
|
|
19
26
|
* @typeParam Incoming - Application messages received by the actor.
|
|
20
27
|
* @typeParam Outgoing - Application messages sent by the actor.
|
|
21
28
|
* @typeParam Tag - Allowed connection tags.
|
|
22
29
|
*/
|
|
23
30
|
declare abstract class Actor<Metadata = JsonValue, Incoming = JsonValue, Outgoing = Incoming, Tag extends string = string> {
|
|
31
|
+
#private;
|
|
24
32
|
/** @internal */
|
|
25
33
|
readonly [actorTypes]: {
|
|
26
34
|
metadata: Metadata;
|
|
@@ -28,15 +36,17 @@ declare abstract class Actor<Metadata = JsonValue, Incoming = JsonValue, Outgoin
|
|
|
28
36
|
outgoing: Outgoing;
|
|
29
37
|
tag: Tag;
|
|
30
38
|
};
|
|
31
|
-
protected constructor();
|
|
32
|
-
/** Actor-local SQLite, available from
|
|
39
|
+
protected constructor(context: ActorContext);
|
|
40
|
+
/** Actor-local SQLite, available from field initializers. Changes commit after a successful invocation. */
|
|
33
41
|
get db(): ActorDatabase;
|
|
42
|
+
/** The actor's single durable alarm slot. */
|
|
43
|
+
get alarm(): ActorAlarm;
|
|
34
44
|
/**
|
|
35
45
|
* Returns a backend reference. The first call starts the actor if needed.
|
|
36
46
|
* @param actorId - 1–128 ASCII letters, digits, dots, underscores, or hyphens.
|
|
37
47
|
*/
|
|
38
48
|
static get<TActorClass extends ActorClass>(this: ValidActorClass<TActorClass>, actorId: string): ActorReference<TActorClass["prototype"]>;
|
|
39
|
-
/** The bound actor ID
|
|
49
|
+
/** The bound actor ID, available from field initializers. */
|
|
40
50
|
protected get id(): string;
|
|
41
51
|
/**
|
|
42
52
|
* Lists connections during an actor call. Includes a joining socket; excludes a disconnected one.
|
|
@@ -53,7 +63,6 @@ declare abstract class Actor<Metadata = JsonValue, Incoming = JsonValue, Outgoin
|
|
|
53
63
|
}
|
|
54
64
|
declare function registerActorClass<Instance extends AnyActor>(actorClass: ActorClass<Instance>, state: ActorSchema): ActorDefinition;
|
|
55
65
|
declare function findActorDefinition(actorName: string): ActorDefinition | undefined;
|
|
56
|
-
declare function bindActorIdentity(instance: AnyActor, actorId: string): void;
|
|
57
66
|
interface ActorDefinition extends ActorClassDescription {
|
|
58
67
|
state: ActorSchema;
|
|
59
68
|
}
|
|
@@ -69,24 +78,23 @@ type ActorClass<Instance extends AnyActor = AnyActor> = Function & {
|
|
|
69
78
|
readonly schemas?: ActorSchemas;
|
|
70
79
|
};
|
|
71
80
|
type AsyncMethod = (...args: never[]) => Promise<unknown>;
|
|
72
|
-
type PubliclyConstructibleActorClass = abstract new (...args: never[]) => AnyActor;
|
|
73
81
|
type InvalidActorMethod<Instance extends AnyActor> = {
|
|
74
82
|
[Key in keyof Instance]-?: NonNullable<Instance[Key]> extends (...args: never[]) => unknown ? NonNullable<Instance[Key]> extends AsyncMethod ? never : Key : never;
|
|
75
83
|
}[keyof Instance];
|
|
76
|
-
type ValidActorClass<TActorClass extends ActorClass> =
|
|
84
|
+
type ValidActorClass<TActorClass extends ActorClass> = InvalidActorMethod<TActorClass["prototype"]> extends never ? TActorClass extends {
|
|
77
85
|
readonly schemas: ActorSchemas<SocketMetadata<TActorClass["prototype"]>, SocketIncoming<TActorClass["prototype"]>, SocketOutgoing<TActorClass["prototype"]>, SocketTag<TActorClass["prototype"]>>;
|
|
78
86
|
} ? TActorClass : TActorClass extends {
|
|
79
87
|
readonly schemas: unknown;
|
|
80
88
|
} ? never : TActorClass : never;
|
|
81
89
|
type ActorReference<Instance extends AnyActor> = {
|
|
82
|
-
[Key in keyof Instance as Instance[Key] extends AsyncMethod ? Key extends
|
|
90
|
+
[Key in keyof Instance as Instance[Key] extends AsyncMethod ? Key extends ActorLifecycleMethod ? never : Key : never]: Instance[Key];
|
|
83
91
|
} & {
|
|
84
92
|
/** Opens a backend socket. Attach listeners immediately; acceptance may still be pending. */
|
|
85
93
|
connect(metadata: SocketMetadata<Instance>): Promise<ActorConnection<SocketIncoming<Instance>, SocketOutgoing<Instance>, JsonObject>>;
|
|
86
94
|
/** Sends to all connections without running actor code. Messages are not saved. */
|
|
87
95
|
broadcast(message: SocketOutgoing<Instance>): Promise<void>;
|
|
88
96
|
};
|
|
89
|
-
type
|
|
97
|
+
type ActorLifecycleMethod = "onConnect" | "onMessage" | "onDisconnect" | "onAlarm";
|
|
90
98
|
type SocketMetadata<Instance extends AnyActor> = Instance[typeof actorTypes]["metadata"];
|
|
91
99
|
type SocketIncoming<Instance extends AnyActor> = Instance[typeof actorTypes]["incoming"];
|
|
92
100
|
type SocketOutgoing<Instance extends AnyActor> = Instance[typeof actorTypes]["outgoing"];
|
|
@@ -95,6 +103,6 @@ type SocketTag<Instance extends AnyActor> = Instance[typeof actorTypes]["tag"];
|
|
|
95
103
|
type ActorSocketOf<Instance extends AnyActor> = ActorSocket<SocketMetadata<Instance>, SocketOutgoing<Instance>, SocketTag<Instance>>;
|
|
96
104
|
/** Incoming message type for an actor instance type. */
|
|
97
105
|
type ActorMessageOf<Instance extends AnyActor> = SocketIncoming<Instance>;
|
|
98
|
-
export { Actor,
|
|
99
|
-
export type { ActorClass, ActorDefinition, ActorMessageOf, ActorReference, ActorSocketOf, AnyActor };
|
|
106
|
+
export { Actor, actorContext, findActorDefinition, registerActorClass };
|
|
107
|
+
export type { ActorClass, ActorContext, ActorDefinition, ActorMessageOf, ActorReference, ActorSocketOf, AnyActor };
|
|
100
108
|
//# sourceMappingURL=actor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/actor/actor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/actor/actor.ts"],"names":[],"mappings":"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"}
|
package/dist/actor/actor.js
CHANGED
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
import { actorClient } from "../client/client.js";
|
|
2
2
|
import { ActorDefinitionError } from "../errors.js";
|
|
3
|
-
import {
|
|
3
|
+
import { RuntimeActorContext } from "./context.js";
|
|
4
4
|
import { validateActorComponent } from "./identity.js";
|
|
5
5
|
import { actorConnectionCount, actorConnections, broadcastActor, setActorAutoResponse } from "./socket.js";
|
|
6
6
|
import { outgoingMessage, socketMetadata } from "./socketValidation.js";
|
|
7
|
-
const actorMetadata = new WeakMap();
|
|
8
7
|
const actorDefinitions = new Map();
|
|
9
8
|
const asyncFunction = Object.getPrototypeOf(async () => { }).constructor;
|
|
10
|
-
const
|
|
9
|
+
const referenceClassKey = Symbol("actor reference class");
|
|
10
|
+
let actorContext;
|
|
11
11
|
/**
|
|
12
|
-
* Base class for durable actors. Extend directly
|
|
12
|
+
* Base class for durable actors. Extend directly; explicit constructors must pass their `ActorContext` to `super`.
|
|
13
13
|
* Application methods must be async; instance fields require `@Persisted` or `@Ephemeral`.
|
|
14
|
+
* Initialized private `ActorResource` fields are implicitly ephemeral.
|
|
14
15
|
* @typeParam Metadata - Connection metadata supplied by the backend.
|
|
15
16
|
* @typeParam Incoming - Application messages received by the actor.
|
|
16
17
|
* @typeParam Outgoing - Application messages sent by the actor.
|
|
17
18
|
* @typeParam Tag - Allowed connection tags.
|
|
18
19
|
*/
|
|
19
20
|
class Actor {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
#context;
|
|
22
|
+
static {
|
|
23
|
+
actorContext = value => (#context in value ? value.#context : undefined);
|
|
22
24
|
}
|
|
23
|
-
|
|
25
|
+
constructor(context) {
|
|
26
|
+
this.#context = RuntimeActorContext.bind(context, this);
|
|
27
|
+
}
|
|
28
|
+
/** Actor-local SQLite, available from field initializers. Changes commit after a successful invocation. */
|
|
24
29
|
get db() {
|
|
25
|
-
return
|
|
30
|
+
return this.#context.database;
|
|
31
|
+
}
|
|
32
|
+
/** The actor's single durable alarm slot. */
|
|
33
|
+
get alarm() {
|
|
34
|
+
return this.#context.alarm;
|
|
26
35
|
}
|
|
27
36
|
/**
|
|
28
37
|
* Returns a backend reference. The first call starts the actor if needed.
|
|
@@ -31,9 +40,9 @@ class Actor {
|
|
|
31
40
|
static get(actorId) {
|
|
32
41
|
return getActorReference(this, validateActorComponent("actor ID", actorId));
|
|
33
42
|
}
|
|
34
|
-
/** The bound actor ID
|
|
43
|
+
/** The bound actor ID, available from field initializers. */
|
|
35
44
|
get id() {
|
|
36
|
-
return
|
|
45
|
+
return this.#context.actorId;
|
|
37
46
|
}
|
|
38
47
|
/**
|
|
39
48
|
* Lists connections during an actor call. Includes a joining socket; excludes a disconnected one.
|
|
@@ -55,8 +64,9 @@ class Actor {
|
|
|
55
64
|
}
|
|
56
65
|
function registerActorClass(actorClass, state) {
|
|
57
66
|
const actorName = actorClassName(actorClass);
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
const reserved = state.fields.find(field => field.name === "db" || field.name === "alarm");
|
|
68
|
+
if (reserved !== undefined)
|
|
69
|
+
throw new ActorDefinitionError(`actor field ${reserved.name} is reserved for the actor runtime`);
|
|
60
70
|
const existing = actorDefinitions.get(actorName);
|
|
61
71
|
if (existing !== undefined) {
|
|
62
72
|
if (existing.actorClass !== actorClass)
|
|
@@ -75,18 +85,13 @@ function getActorReference(actorClass, actorId) {
|
|
|
75
85
|
const Reference = referenceClass(actorClass);
|
|
76
86
|
return new Reference(actorId);
|
|
77
87
|
}
|
|
78
|
-
function bindActorIdentity(instance, actorId) {
|
|
79
|
-
actorMetadata.set(instance, { actorId: validateActorComponent("actor ID", actorId) });
|
|
80
|
-
}
|
|
81
88
|
function referenceClass(actorClass) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return existing;
|
|
89
|
+
if (Object.hasOwn(actorClass, referenceClassKey))
|
|
90
|
+
return Reflect.get(actorClass, referenceClassKey);
|
|
85
91
|
const definition = describeActorClass(actorClass);
|
|
86
92
|
class ActorReference extends Actor {
|
|
87
93
|
constructor(actorId) {
|
|
88
|
-
super();
|
|
89
|
-
bindActorIdentity(this, actorId);
|
|
94
|
+
super(RuntimeActorContext.reference(actorId));
|
|
90
95
|
}
|
|
91
96
|
}
|
|
92
97
|
Object.defineProperty(ActorReference.prototype, "connect", {
|
|
@@ -94,9 +99,9 @@ function referenceClass(actorClass) {
|
|
|
94
99
|
enumerable: false,
|
|
95
100
|
writable: false,
|
|
96
101
|
value: function connectActor(metadata) {
|
|
97
|
-
const
|
|
102
|
+
const actorId = actorIdOf(this);
|
|
98
103
|
const attachment = socketMetadata(metadata, definition.schemas);
|
|
99
|
-
return actorClient().then(client => client.connect(definition.actorName,
|
|
104
|
+
return actorClient().then(client => client.connect(definition.actorName, actorId, attachment, definition.schemas));
|
|
100
105
|
}
|
|
101
106
|
});
|
|
102
107
|
Object.defineProperty(ActorReference.prototype, "broadcast", {
|
|
@@ -104,9 +109,9 @@ function referenceClass(actorClass) {
|
|
|
104
109
|
enumerable: false,
|
|
105
110
|
writable: false,
|
|
106
111
|
value: function broadcastActorMessage(message) {
|
|
107
|
-
const
|
|
112
|
+
const actorId = actorIdOf(this);
|
|
108
113
|
const outgoing = outgoingMessage(message, definition.schemas);
|
|
109
|
-
return actorClient().then(client => client.broadcast(definition.actorName,
|
|
114
|
+
return actorClient().then(client => client.broadcast(definition.actorName, actorId, outgoing));
|
|
110
115
|
}
|
|
111
116
|
});
|
|
112
117
|
definition.methods.forEach(method => {
|
|
@@ -115,19 +120,19 @@ function referenceClass(actorClass) {
|
|
|
115
120
|
enumerable: false,
|
|
116
121
|
writable: false,
|
|
117
122
|
value: function forwardActorMethod(...args) {
|
|
118
|
-
const
|
|
119
|
-
return actorClient().then(client => client.invoke(definition.actorName,
|
|
123
|
+
const actorId = actorIdOf(this);
|
|
124
|
+
return actorClient().then(client => client.invoke(definition.actorName, actorId, method, args));
|
|
120
125
|
}
|
|
121
126
|
});
|
|
122
127
|
});
|
|
123
|
-
|
|
128
|
+
Object.defineProperty(actorClass, referenceClassKey, { value: ActorReference });
|
|
124
129
|
return ActorReference;
|
|
125
130
|
}
|
|
126
|
-
function
|
|
127
|
-
const
|
|
128
|
-
if (
|
|
131
|
+
function actorIdOf(instance) {
|
|
132
|
+
const context = actorContext(instance);
|
|
133
|
+
if (context === undefined)
|
|
129
134
|
throw new ActorDefinitionError("actor identity is unavailable outside an actor invocation");
|
|
130
|
-
return
|
|
135
|
+
return context.actorId;
|
|
131
136
|
}
|
|
132
137
|
function describeActorClass(actorClass) {
|
|
133
138
|
const actorName = actorClassName(actorClass);
|
|
@@ -152,26 +157,26 @@ function discoverMethods(actorClass, actorName) {
|
|
|
152
157
|
validateActorComponent("actor method", name);
|
|
153
158
|
if (name === "then")
|
|
154
159
|
throw new ActorDefinitionError(`actor class ${actorName} cannot define method then`);
|
|
155
|
-
if (name === "connect" || name === "broadcast" || name === "db")
|
|
160
|
+
if (name === "connect" || name === "broadcast" || name === "db" || name === "alarm")
|
|
156
161
|
throw new ActorDefinitionError(`actor class ${actorName} cannot define reserved method ${name}`);
|
|
157
162
|
if (!(descriptor.value instanceof asyncFunction))
|
|
158
163
|
throw new ActorDefinitionError(`actor method ${actorName}.${name} must be async`);
|
|
164
|
+
if (name === "onAlarm" && descriptor.value.length !== 0)
|
|
165
|
+
throw new ActorDefinitionError(`actor lifecycle hook ${actorName}.onAlarm must take no arguments`);
|
|
159
166
|
if (lifecycleMethods.has(name))
|
|
160
167
|
return [];
|
|
161
168
|
return [name];
|
|
162
169
|
});
|
|
163
170
|
}
|
|
164
|
-
const lifecycleMethods = new Set(["onConnect", "onMessage", "onDisconnect"]);
|
|
171
|
+
const lifecycleMethods = new Set(["onConnect", "onMessage", "onDisconnect", "onAlarm"]);
|
|
165
172
|
function validateActorClass(actorClass, actorName) {
|
|
166
173
|
if (Object.getPrototypeOf(actorClass.prototype) !== Actor.prototype)
|
|
167
174
|
throw new ActorDefinitionError(`actor class ${actorName} must extend Actor directly`);
|
|
168
|
-
if (actorClass.length !== 0)
|
|
169
|
-
throw new ActorDefinitionError(`actor class ${actorName} cannot require constructor arguments`);
|
|
170
175
|
}
|
|
171
176
|
function actorClassName(actorClass) {
|
|
172
177
|
if (actorClass.name.length === 0)
|
|
173
178
|
throw new ActorDefinitionError("actor classes must be named");
|
|
174
179
|
return actorClass.name;
|
|
175
180
|
}
|
|
176
|
-
export { Actor,
|
|
181
|
+
export { Actor, actorContext, findActorDefinition, registerActorClass };
|
|
177
182
|
//# sourceMappingURL=actor.js.map
|
package/dist/actor/actor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/actor/actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/actor/actor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** One durable scheduled callback for an actor. */
|
|
2
|
+
interface ActorAlarm {
|
|
3
|
+
/** Returns the scheduled Unix timestamp in milliseconds, or `null` when unset. */
|
|
4
|
+
get(): number | null;
|
|
5
|
+
/** Replaces the alarm with a Unix timestamp in milliseconds. Past timestamps are immediately due. */
|
|
6
|
+
set(timestampMs: number): void;
|
|
7
|
+
/** Clears the scheduled alarm. */
|
|
8
|
+
delete(): void;
|
|
9
|
+
}
|
|
10
|
+
interface ActorAlarmState {
|
|
11
|
+
readonly timestampMs: number | null;
|
|
12
|
+
}
|
|
13
|
+
interface ActorAlarmStorage {
|
|
14
|
+
getAlarmState(): ActorAlarmState;
|
|
15
|
+
setAlarm(timestampMs: number): void;
|
|
16
|
+
deleteAlarm(): void;
|
|
17
|
+
}
|
|
18
|
+
export type { ActorAlarm, ActorAlarmState, ActorAlarmStorage };
|
|
19
|
+
//# sourceMappingURL=alarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm.d.ts","sourceRoot":"","sources":["../../src/actor/alarm.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,UAAU,UAAU;IAChB,kFAAkF;IAClF,GAAG,IAAI,MAAM,GAAG,IAAI,CAAA;IACpB,qGAAqG;IACrG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,kCAAkC;IAClC,MAAM,IAAI,IAAI,CAAA;CACjB;AAED,UAAU,eAAe;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC;AAED,UAAU,iBAAiB;IACvB,aAAa,IAAI,eAAe,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,WAAW,IAAI,IAAI,CAAA;CACtB;AAED,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm.js","sourceRoot":"","sources":["../../src/actor/alarm.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ActorAlarm, ActorAlarmStorage } from "./alarm.js";
|
|
2
|
+
import type { ActorDatabase } from "./database.js";
|
|
3
|
+
declare const actorContextBrand: unique symbol;
|
|
4
|
+
interface ActorContext {
|
|
5
|
+
readonly [actorContextBrand]: never;
|
|
6
|
+
}
|
|
7
|
+
declare class RuntimeActorContext implements ActorContext {
|
|
8
|
+
#private;
|
|
9
|
+
readonly [actorContextBrand]: never;
|
|
10
|
+
readonly actorId: string;
|
|
11
|
+
readonly persistedFields: Map<string, PropertyDescriptor>;
|
|
12
|
+
private constructor();
|
|
13
|
+
static runtime(actorId: string, database: ActorDatabase & ActorAlarmStorage): RuntimeActorContext;
|
|
14
|
+
static reference(actorId: string): RuntimeActorContext;
|
|
15
|
+
static bind(context: unknown, actor: object): RuntimeActorContext;
|
|
16
|
+
construct(actorClass: Function): object;
|
|
17
|
+
get database(): ActorDatabase;
|
|
18
|
+
get alarm(): ActorAlarm;
|
|
19
|
+
assertAccess(): void;
|
|
20
|
+
private guard;
|
|
21
|
+
private guardAlarm;
|
|
22
|
+
}
|
|
23
|
+
export { RuntimeActorContext };
|
|
24
|
+
export type { ActorContext };
|
|
25
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/actor/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,eAAe,CAAA;AAI/D,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAA;AAE9C,UAAU,YAAY;IAClB,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAA;CACtC;AAED,cAAM,mBAAoB,YAAW,YAAY;;IAC7C,SAAiB,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,eAAe,kCAAwC;IAMhE,OAAO;IAMP,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,iBAAiB,GAAG,mBAAmB;IAIjG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAItD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAOjE,SAAS,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM;IAYvC,IAAI,QAAQ,IAAI,aAAa,CAI5B;IAED,IAAI,KAAK,IAAI,UAAU,CAItB;IAED,YAAY,IAAI,IAAI;IAKpB,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,UAAU;CAkBrB;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAC9B,YAAY,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ActorDefinitionError, ActorValidationError } from "../errors.js";
|
|
2
|
+
import { isActorInvocation } from "./database.js";
|
|
3
|
+
import { validateActorComponent } from "./identity.js";
|
|
4
|
+
class RuntimeActorContext {
|
|
5
|
+
actorId;
|
|
6
|
+
persistedFields = new Map();
|
|
7
|
+
#database;
|
|
8
|
+
#alarm;
|
|
9
|
+
#actor;
|
|
10
|
+
#constructing = false;
|
|
11
|
+
constructor(actorId, database) {
|
|
12
|
+
this.actorId = validateActorComponent("actor ID", actorId);
|
|
13
|
+
this.#database = database && this.guard(database);
|
|
14
|
+
this.#alarm = database && this.guardAlarm(database);
|
|
15
|
+
}
|
|
16
|
+
static runtime(actorId, database) {
|
|
17
|
+
return new RuntimeActorContext(actorId, database);
|
|
18
|
+
}
|
|
19
|
+
static reference(actorId) {
|
|
20
|
+
return new RuntimeActorContext(actorId);
|
|
21
|
+
}
|
|
22
|
+
static bind(context, actor) {
|
|
23
|
+
if (typeof context !== "object" || context === null || !(#actor in context) || context.#actor !== undefined)
|
|
24
|
+
throw new ActorDefinitionError("actors are constructed by the actor runtime");
|
|
25
|
+
context.#actor = actor;
|
|
26
|
+
return context;
|
|
27
|
+
}
|
|
28
|
+
construct(actorClass) {
|
|
29
|
+
this.#constructing = true;
|
|
30
|
+
try {
|
|
31
|
+
const actor = Reflect.construct(actorClass, [this]);
|
|
32
|
+
if (this.#actor !== actor)
|
|
33
|
+
throw new ActorDefinitionError("actor constructors must call super with their ActorContext");
|
|
34
|
+
return actor;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
this.#constructing = false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
get database() {
|
|
41
|
+
if (this.#database === undefined)
|
|
42
|
+
throw new ActorDefinitionError("actor database is unavailable outside the actor runtime");
|
|
43
|
+
return this.#database;
|
|
44
|
+
}
|
|
45
|
+
get alarm() {
|
|
46
|
+
if (this.#alarm === undefined)
|
|
47
|
+
throw new ActorDefinitionError("actor alarm is unavailable outside the actor runtime");
|
|
48
|
+
return this.#alarm;
|
|
49
|
+
}
|
|
50
|
+
assertAccess() {
|
|
51
|
+
if (this.#constructing || (this.#actor !== undefined && isActorInvocation(this.#actor)))
|
|
52
|
+
return;
|
|
53
|
+
throw new ActorDefinitionError("actor database is unavailable outside its invocation");
|
|
54
|
+
}
|
|
55
|
+
guard(database) {
|
|
56
|
+
return {
|
|
57
|
+
exec: (sql, ...bindings) => {
|
|
58
|
+
this.assertAccess();
|
|
59
|
+
return database.exec(sql, ...bindings);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
guardAlarm(alarm) {
|
|
64
|
+
return {
|
|
65
|
+
get: () => {
|
|
66
|
+
this.assertAccess();
|
|
67
|
+
return alarm.getAlarmState().timestampMs;
|
|
68
|
+
},
|
|
69
|
+
set: timestampMs => {
|
|
70
|
+
this.assertAccess();
|
|
71
|
+
if (!Number.isSafeInteger(timestampMs))
|
|
72
|
+
throw new ActorValidationError("actor alarm timestamp must be a safe integer");
|
|
73
|
+
alarm.setAlarm(timestampMs);
|
|
74
|
+
},
|
|
75
|
+
delete: () => {
|
|
76
|
+
this.assertAccess();
|
|
77
|
+
alarm.deleteAlarm();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export { RuntimeActorContext };
|
|
83
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/actor/context.ts"],"names":[],"mappings":"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"}
|
package/dist/actor/database.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ interface ActorDatabase {
|
|
|
3
3
|
/** Executes one SQL statement with positional bindings and returns its rows. */
|
|
4
4
|
exec<Row extends object = Record<string, SqliteValue>>(sql: string, ...bindings: SqliteValue[]): Row[];
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
declare function
|
|
8
|
-
declare function
|
|
9
|
-
declare function runWithActorDatabase<T>(actor: object, operation: () => Promise<T>): Promise<T>;
|
|
10
|
-
export {
|
|
6
|
+
type PersistenceMode = "atomic" | "immediate";
|
|
7
|
+
declare function isActorInvocation(actor: object): boolean;
|
|
8
|
+
declare function actorDatabaseMode(): PersistenceMode | undefined;
|
|
9
|
+
declare function runWithActorDatabase<T>(actor: object, mode: PersistenceMode, operation: () => Promise<T>): Promise<T>;
|
|
10
|
+
export { actorDatabaseMode, isActorInvocation, runWithActorDatabase };
|
|
11
11
|
export type { ActorDatabase, SqliteValue };
|
|
12
12
|
//# sourceMappingURL=database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/actor/database.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/actor/database.ts"],"names":[],"mappings":"AAEA,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;AAE/D,UAAU,aAAa;IACnB,gFAAgF;IAChF,IAAI,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,CAAA;CACzG;AAED,KAAK,eAAe,GAAG,QAAQ,GAAG,WAAW,CAAA;AAU7C,iBAAS,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,iBAAS,iBAAiB,IAAI,eAAe,GAAG,SAAS,CAGxD;AAED,iBAAe,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOpH;AAED,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAA;AACrE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA"}
|
package/dist/actor/database.js
CHANGED
|
@@ -1,43 +1,15 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
-
import { ActorDefinitionError } from "../errors.js";
|
|
3
|
-
const databases = new WeakMap();
|
|
4
2
|
const invocation = new AsyncLocalStorage();
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
if (database === undefined)
|
|
9
|
-
throw new ActorDefinitionError("actor database is unavailable outside the actor runtime");
|
|
10
|
-
return database;
|
|
3
|
+
function isActorInvocation(actor) {
|
|
4
|
+
const context = invocation.getStore();
|
|
5
|
+
return context?.actor === actor && context.active;
|
|
11
6
|
}
|
|
12
|
-
function
|
|
13
|
-
const context =
|
|
14
|
-
|
|
15
|
-
return construction.run(context, construct);
|
|
16
|
-
}
|
|
17
|
-
finally {
|
|
18
|
-
context.active = false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function bindConstructingActorDatabase(actor) {
|
|
22
|
-
const context = construction.getStore();
|
|
23
|
-
if (!context?.active || context.actor !== undefined)
|
|
24
|
-
return;
|
|
25
|
-
context.actor = actor;
|
|
26
|
-
bindActorDatabase(actor, context.database);
|
|
27
|
-
}
|
|
28
|
-
function bindActorDatabase(actor, database) {
|
|
29
|
-
databases.set(actor, {
|
|
30
|
-
exec(sql, ...bindings) {
|
|
31
|
-
const context = invocation.getStore();
|
|
32
|
-
const creating = construction.getStore();
|
|
33
|
-
if (!(context?.actor === actor && context.active) && !(creating?.actor === actor && creating.active))
|
|
34
|
-
throw new ActorDefinitionError("actor database is unavailable outside its invocation");
|
|
35
|
-
return database.exec(sql, ...bindings);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
7
|
+
function actorDatabaseMode() {
|
|
8
|
+
const context = invocation.getStore();
|
|
9
|
+
return context?.active ? context.mode : undefined;
|
|
38
10
|
}
|
|
39
|
-
async function runWithActorDatabase(actor, operation) {
|
|
40
|
-
const context = { actor, active: true };
|
|
11
|
+
async function runWithActorDatabase(actor, mode, operation) {
|
|
12
|
+
const context = { actor, active: true, mode };
|
|
41
13
|
try {
|
|
42
14
|
return await invocation.run(context, operation);
|
|
43
15
|
}
|
|
@@ -45,5 +17,5 @@ async function runWithActorDatabase(actor, operation) {
|
|
|
45
17
|
context.active = false;
|
|
46
18
|
}
|
|
47
19
|
}
|
|
48
|
-
export {
|
|
20
|
+
export { actorDatabaseMode, isActorInvocation, runWithActorDatabase };
|
|
49
21
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/actor/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/actor/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAiBpD,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAA0B,CAAA;AAElE,SAAS,iBAAiB,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;IACrC,OAAO,OAAO,EAAE,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAA;AACrD,CAAC;AAED,SAAS,iBAAiB;IACtB,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;IACrC,OAAO,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAI,KAAa,EAAE,IAAqB,EAAE,SAA2B;IACpG,MAAM,OAAO,GAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACrE,IAAI,CAAC;QACD,OAAO,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACnD,CAAC;YAAS,CAAC;QACP,OAAO,CAAC,MAAM,GAAG,KAAK,CAAA;IAC1B,CAAC;AACL,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAA"}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { ActorResource } from "./resource.js";
|
|
2
|
+
/** Marks a method for whole-call transactions. Currently all non-interleaved calls use this behavior. */
|
|
3
|
+
declare function Atomic(_value: Function, context: ClassMethodDecoratorContext): void;
|
|
1
4
|
/**
|
|
2
5
|
* Lets other calls run during awaits. State may change while waiting.
|
|
3
6
|
* Disables error rollback for the whole actor class. State is saved on successful completion.
|
|
4
7
|
* @experimental
|
|
5
8
|
*/
|
|
6
9
|
declare function Interleave(_value: Function, context: ClassMethodDecoratorContext): void;
|
|
7
|
-
/**
|
|
10
|
+
/** Writes assignments to SQLite; reassign objects and arrays to save changes. Commits after successful calls. */
|
|
8
11
|
declare function Persisted(_value: undefined, context: ClassFieldDecoratorContext): void;
|
|
9
12
|
/** Marks a temporary field that may reset between calls. */
|
|
10
13
|
declare function Ephemeral(_value: undefined, context: ClassFieldDecoratorContext): void;
|
|
11
14
|
/** Sends browser state updates for a public `@Persisted` field. */
|
|
12
15
|
declare function Emittable(_value: undefined, context: ClassFieldDecoratorContext): void;
|
|
13
|
-
|
|
16
|
+
/** Marks a property as being a Resource. Includes them in Actor Lifecycle */
|
|
17
|
+
declare function Resource<This, Value extends ActorResource>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>): void;
|
|
18
|
+
export { Atomic, Emittable, Ephemeral, Interleave, Persisted, Resource };
|
|
14
19
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/actor/decorators.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAGhF;AAED
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/actor/decorators.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,yGAAyG;AACzG,iBAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAG5E;AAED;;;;GAIG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAGhF;AAED,iHAAiH;AACjH,iBAAS,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAG/E;AAED,4DAA4D;AAC5D,iBAAS,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAE/E;AAED,mEAAmE;AACnE,iBAAS,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAG/E;AAED,6EAA6E;AAC7E,iBAAS,QAAQ,CAAC,IAAI,EAAE,KAAK,SAAS,aAAa,EAC/C,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,GACjD,IAAI,CAEN;AAOD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA"}
|