durable-actors 0.7.16 → 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 +6 -6
- package/bin/durable-actors.js +2 -0
- package/dist/actor/actor.d.ts +20 -12
- package/dist/actor/actor.d.ts.map +1 -1
- package/dist/actor/actor.js +42 -35
- 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 -4
- package/dist/actor/database.d.ts.map +1 -1
- package/dist/actor/database.js +9 -19
- 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/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +13 -42
- package/dist/cli/dev.js.map +1 -1
- 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/python.d.ts.map +1 -1
- package/dist/cli/python.js +0 -1
- package/dist/cli/python.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +11 -18
- 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 +2678 -183
- package/dist/compiler/declarations.js.map +7 -1
- 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 -79
- 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/projectSdk.js +1 -1
- package/dist/projectSdk.js.map +1 -1
- package/dist/templates/actor/README.md +7 -9
- package/dist/templates/actor/bunfig +2 -0
- package/dist/templates/actor/package.json +6 -3
- package/dist/templates/ai-chat/README.md +8 -8
- package/dist/templates/ai-chat/bunfig +2 -0
- package/dist/templates/ai-chat/package.json +7 -5
- package/dist/templates/ai-chat/src/actors.ts +1 -1
- package/dist/templates/chat/README.md +8 -8
- package/dist/templates/chat/bunfig +2 -0
- package/dist/templates/chat/package.json +7 -5
- package/dist/templates/chat/src/actors.ts +1 -1
- package/dist/templates/documents/README.md +8 -8
- package/dist/templates/documents/bunfig +2 -0
- package/dist/templates/documents/package.json +7 -5
- package/dist/templates/documents/src/actors.ts +1 -1
- package/package.json +110 -108
- package/dist/cli/actor-source-watcher.d.ts +0 -25
- package/dist/cli/actor-source-watcher.d.ts.map +0 -1
- package/dist/cli/actor-source-watcher.js +0 -129
- package/dist/cli/actor-source-watcher.js.map +0 -1
- 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 -159
- package/dist/host/sqlite.js.map +0 -1
- package/dist/templates/actor/pnpm-workspace.yaml +0 -2
- package/dist/templates/ai-chat/pnpm-workspace.yaml +0 -2
- package/dist/templates/chat/pnpm-workspace.yaml +0 -2
- package/dist/templates/documents/pnpm-workspace.yaml +0 -2
- package/dist/templates/python/README.md +0 -7
- package/dist/templates/python/gitignore +0 -6
- package/dist/templates/python/package.json +0 -11
- package/dist/templates/python/pnpm-workspace.yaml +0 -2
- package/dist/templates/python/pyproject.toml +0 -8
- package/dist/templates/python/src/actors.py +0 -9
package/README.md
CHANGED
|
@@ -6,15 +6,15 @@ Durable actors and typed clients, backed by the Rust runtime.
|
|
|
6
6
|
|
|
7
7
|
## Quickstart
|
|
8
8
|
|
|
9
|
-
Requires
|
|
9
|
+
Requires Bun 1.4.2+.
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
|
|
12
|
+
bunx durable-actors init my-actors
|
|
13
13
|
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"
|
|
@@ -29,7 +29,7 @@ export class Counter extends Actor {
|
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
```sh
|
|
32
|
-
|
|
32
|
+
bunx durable-actors dev
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## Call an actor
|
|
@@ -37,7 +37,7 @@ pnpm exec durable-actors dev
|
|
|
37
37
|
In another terminal in the same directory, generate the client:
|
|
38
38
|
|
|
39
39
|
```sh
|
|
40
|
-
|
|
40
|
+
bunx durable-actors generate
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
Save as `client.ts` and run `bun client.ts`:
|
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. Changes commit
|
|
33
|
-
|
|
39
|
+
protected constructor(context: ActorContext);
|
|
40
|
+
/** Actor-local SQLite, available from field initializers. Changes commit after a successful invocation. */
|
|
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,26 +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);
|
|
24
|
+
}
|
|
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. */
|
|
22
29
|
get db() {
|
|
23
|
-
return
|
|
30
|
+
return this.#context.database;
|
|
31
|
+
}
|
|
32
|
+
/** The actor's single durable alarm slot. */
|
|
33
|
+
get alarm() {
|
|
34
|
+
return this.#context.alarm;
|
|
24
35
|
}
|
|
25
36
|
/**
|
|
26
37
|
* Returns a backend reference. The first call starts the actor if needed.
|
|
@@ -29,9 +40,9 @@ class Actor {
|
|
|
29
40
|
static get(actorId) {
|
|
30
41
|
return getActorReference(this, validateActorComponent("actor ID", actorId));
|
|
31
42
|
}
|
|
32
|
-
/** The bound actor ID
|
|
43
|
+
/** The bound actor ID, available from field initializers. */
|
|
33
44
|
get id() {
|
|
34
|
-
return
|
|
45
|
+
return this.#context.actorId;
|
|
35
46
|
}
|
|
36
47
|
/**
|
|
37
48
|
* Lists connections during an actor call. Includes a joining socket; excludes a disconnected one.
|
|
@@ -53,8 +64,9 @@ class Actor {
|
|
|
53
64
|
}
|
|
54
65
|
function registerActorClass(actorClass, state) {
|
|
55
66
|
const actorName = actorClassName(actorClass);
|
|
56
|
-
|
|
57
|
-
|
|
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`);
|
|
58
70
|
const existing = actorDefinitions.get(actorName);
|
|
59
71
|
if (existing !== undefined) {
|
|
60
72
|
if (existing.actorClass !== actorClass)
|
|
@@ -73,18 +85,13 @@ function getActorReference(actorClass, actorId) {
|
|
|
73
85
|
const Reference = referenceClass(actorClass);
|
|
74
86
|
return new Reference(actorId);
|
|
75
87
|
}
|
|
76
|
-
function bindActorIdentity(instance, actorId) {
|
|
77
|
-
actorMetadata.set(instance, { actorId: validateActorComponent("actor ID", actorId) });
|
|
78
|
-
}
|
|
79
88
|
function referenceClass(actorClass) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return existing;
|
|
89
|
+
if (Object.hasOwn(actorClass, referenceClassKey))
|
|
90
|
+
return Reflect.get(actorClass, referenceClassKey);
|
|
83
91
|
const definition = describeActorClass(actorClass);
|
|
84
92
|
class ActorReference extends Actor {
|
|
85
93
|
constructor(actorId) {
|
|
86
|
-
super();
|
|
87
|
-
bindActorIdentity(this, actorId);
|
|
94
|
+
super(RuntimeActorContext.reference(actorId));
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
Object.defineProperty(ActorReference.prototype, "connect", {
|
|
@@ -92,9 +99,9 @@ function referenceClass(actorClass) {
|
|
|
92
99
|
enumerable: false,
|
|
93
100
|
writable: false,
|
|
94
101
|
value: function connectActor(metadata) {
|
|
95
|
-
const
|
|
102
|
+
const actorId = actorIdOf(this);
|
|
96
103
|
const attachment = socketMetadata(metadata, definition.schemas);
|
|
97
|
-
return actorClient().then(client => client.connect(definition.actorName,
|
|
104
|
+
return actorClient().then(client => client.connect(definition.actorName, actorId, attachment, definition.schemas));
|
|
98
105
|
}
|
|
99
106
|
});
|
|
100
107
|
Object.defineProperty(ActorReference.prototype, "broadcast", {
|
|
@@ -102,9 +109,9 @@ function referenceClass(actorClass) {
|
|
|
102
109
|
enumerable: false,
|
|
103
110
|
writable: false,
|
|
104
111
|
value: function broadcastActorMessage(message) {
|
|
105
|
-
const
|
|
112
|
+
const actorId = actorIdOf(this);
|
|
106
113
|
const outgoing = outgoingMessage(message, definition.schemas);
|
|
107
|
-
return actorClient().then(client => client.broadcast(definition.actorName,
|
|
114
|
+
return actorClient().then(client => client.broadcast(definition.actorName, actorId, outgoing));
|
|
108
115
|
}
|
|
109
116
|
});
|
|
110
117
|
definition.methods.forEach(method => {
|
|
@@ -113,19 +120,19 @@ function referenceClass(actorClass) {
|
|
|
113
120
|
enumerable: false,
|
|
114
121
|
writable: false,
|
|
115
122
|
value: function forwardActorMethod(...args) {
|
|
116
|
-
const
|
|
117
|
-
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));
|
|
118
125
|
}
|
|
119
126
|
});
|
|
120
127
|
});
|
|
121
|
-
|
|
128
|
+
Object.defineProperty(actorClass, referenceClassKey, { value: ActorReference });
|
|
122
129
|
return ActorReference;
|
|
123
130
|
}
|
|
124
|
-
function
|
|
125
|
-
const
|
|
126
|
-
if (
|
|
131
|
+
function actorIdOf(instance) {
|
|
132
|
+
const context = actorContext(instance);
|
|
133
|
+
if (context === undefined)
|
|
127
134
|
throw new ActorDefinitionError("actor identity is unavailable outside an actor invocation");
|
|
128
|
-
return
|
|
135
|
+
return context.actorId;
|
|
129
136
|
}
|
|
130
137
|
function describeActorClass(actorClass) {
|
|
131
138
|
const actorName = actorClassName(actorClass);
|
|
@@ -150,26 +157,26 @@ function discoverMethods(actorClass, actorName) {
|
|
|
150
157
|
validateActorComponent("actor method", name);
|
|
151
158
|
if (name === "then")
|
|
152
159
|
throw new ActorDefinitionError(`actor class ${actorName} cannot define method then`);
|
|
153
|
-
if (name === "connect" || name === "broadcast" || name === "db")
|
|
160
|
+
if (name === "connect" || name === "broadcast" || name === "db" || name === "alarm")
|
|
154
161
|
throw new ActorDefinitionError(`actor class ${actorName} cannot define reserved method ${name}`);
|
|
155
162
|
if (!(descriptor.value instanceof asyncFunction))
|
|
156
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`);
|
|
157
166
|
if (lifecycleMethods.has(name))
|
|
158
167
|
return [];
|
|
159
168
|
return [name];
|
|
160
169
|
});
|
|
161
170
|
}
|
|
162
|
-
const lifecycleMethods = new Set(["onConnect", "onMessage", "onDisconnect"]);
|
|
171
|
+
const lifecycleMethods = new Set(["onConnect", "onMessage", "onDisconnect", "onAlarm"]);
|
|
163
172
|
function validateActorClass(actorClass, actorName) {
|
|
164
173
|
if (Object.getPrototypeOf(actorClass.prototype) !== Actor.prototype)
|
|
165
174
|
throw new ActorDefinitionError(`actor class ${actorName} must extend Actor directly`);
|
|
166
|
-
if (actorClass.length !== 0)
|
|
167
|
-
throw new ActorDefinitionError(`actor class ${actorName} cannot require constructor arguments`);
|
|
168
175
|
}
|
|
169
176
|
function actorClassName(actorClass) {
|
|
170
177
|
if (actorClass.name.length === 0)
|
|
171
178
|
throw new ActorDefinitionError("actor classes must be named");
|
|
172
179
|
return actorClass.name;
|
|
173
180
|
}
|
|
174
|
-
export { Actor,
|
|
181
|
+
export { Actor, actorContext, findActorDefinition, registerActorClass };
|
|
175
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,9 +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
|
-
|
|
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 };
|
|
10
11
|
export type { ActorDatabase, SqliteValue };
|
|
11
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,25 +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
|
-
function
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
throw new ActorDefinitionError("actor database is unavailable during construction");
|
|
9
|
-
return database;
|
|
3
|
+
function isActorInvocation(actor) {
|
|
4
|
+
const context = invocation.getStore();
|
|
5
|
+
return context?.actor === actor && context.active;
|
|
10
6
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const context = invocation.getStore();
|
|
15
|
-
if (context?.actor !== actor || !context.active)
|
|
16
|
-
throw new ActorDefinitionError("actor database is unavailable outside its invocation");
|
|
17
|
-
return database.exec(sql, ...bindings);
|
|
18
|
-
}
|
|
19
|
-
});
|
|
7
|
+
function actorDatabaseMode() {
|
|
8
|
+
const context = invocation.getStore();
|
|
9
|
+
return context?.active ? context.mode : undefined;
|
|
20
10
|
}
|
|
21
|
-
async function runWithActorDatabase(actor, operation) {
|
|
22
|
-
const context = { actor, active: true };
|
|
11
|
+
async function runWithActorDatabase(actor, mode, operation) {
|
|
12
|
+
const context = { actor, active: true, mode };
|
|
23
13
|
try {
|
|
24
14
|
return await invocation.run(context, operation);
|
|
25
15
|
}
|
|
@@ -27,5 +17,5 @@ async function runWithActorDatabase(actor, operation) {
|
|
|
27
17
|
context.active = false;
|
|
28
18
|
}
|
|
29
19
|
}
|
|
30
|
-
export {
|
|
20
|
+
export { actorDatabaseMode, isActorInvocation, runWithActorDatabase };
|
|
31
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"}
|