Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -184,3 +184,4 @@ Cargo.lock
**/.wrangler
**/.DS_Store
.aider*
/packages/core/dist/schemas/
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
},
"devDependencies": {
"@biomejs/biome": "^2.1.1",
"tsup": "^8.4.0",
"@types/ws": "^8.5.14",
"commander": "^14.0.0",
"dedent": "^1.5.3",
Expand Down
101 changes: 52 additions & 49 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,122 +24,122 @@
"exports": {
".": {
"import": {
"types": "./dist/mod.d.ts",
"default": "./dist/mod.js"
"types": "./dist/tsup/mod.d.ts",
"default": "./dist/tsup/mod.js"
},
"require": {
"types": "./dist/mod.d.cts",
"default": "./dist/mod.cjs"
"types": "./dist/tsup/mod.d.cts",
"default": "./dist/tsup/mod.cjs"
}
},
"./client": {
"import": {
"types": "./dist/client/mod.d.ts",
"default": "./dist/client/mod.js"
"types": "./dist/tsup/client/mod.d.ts",
"default": "./dist/tsup/client/mod.js"
},
"require": {
"types": "./dist/client/mod.d.cts",
"default": "./dist/client/mod.cjs"
"types": "./dist/tsup/client/mod.d.cts",
"default": "./dist/tsup/client/mod.cjs"
}
},
"./log": {
"import": {
"types": "./dist/common/log.d.ts",
"default": "./dist/common/log.js"
"types": "./dist/tsup/common/log.d.ts",
"default": "./dist/tsup/common/log.js"
},
"require": {
"types": "./dist/common/log.d.cts",
"default": "./dist/common/log.cjs"
"types": "./dist/tsup/common/log.d.cts",
"default": "./dist/tsup/common/log.cjs"
}
},
"./errors": {
"import": {
"types": "./dist/actor/errors.d.ts",
"default": "./dist/actor/errors.js"
"types": "./dist/tsup/actor/errors.d.ts",
"default": "./dist/tsup/actor/errors.js"
},
"require": {
"types": "./dist/actor/errors.d.cts",
"default": "./dist/actor/errors.cjs"
"types": "./dist/tsup/actor/errors.d.cts",
"default": "./dist/tsup/actor/errors.cjs"
}
},
"./utils": {
"import": {
"types": "./dist/utils.d.ts",
"default": "./dist/utils.js"
"types": "./dist/tsup/utils.d.ts",
"default": "./dist/tsup/utils.js"
},
"require": {
"types": "./dist/utils.d.cts",
"default": "./dist/utils.cjs"
"types": "./dist/tsup/utils.d.cts",
"default": "./dist/tsup/utils.cjs"
}
},
"./driver-helpers": {
"import": {
"types": "./dist/driver-helpers/mod.d.ts",
"default": "./dist/driver-helpers/mod.js"
"types": "./dist/tsup/driver-helpers/mod.d.ts",
"default": "./dist/tsup/driver-helpers/mod.js"
},
"require": {
"types": "./dist/driver-helpers/mod.d.cts",
"default": "./dist/driver-helpers/mod.cjs"
"types": "./dist/tsup/driver-helpers/mod.d.cts",
"default": "./dist/tsup/driver-helpers/mod.cjs"
}
},
"./driver-helpers/websocket": {
"import": {
"types": "./dist/common/websocket.d.ts",
"default": "./dist/common/websocket.js"
"types": "./dist/tsup/common/websocket.d.ts",
"default": "./dist/tsup/common/websocket.js"
},
"require": {
"types": "./dist/common/websocket.d.cts",
"default": "./dist/common/websocket.cjs"
"types": "./dist/tsup/common/websocket.d.cts",
"default": "./dist/tsup/common/websocket.cjs"
}
},
"./driver-test-suite": {
"import": {
"types": "./dist/driver-test-suite/mod.d.ts",
"default": "./dist/driver-test-suite/mod.js"
"types": "./dist/tsup/driver-test-suite/mod.d.ts",
"default": "./dist/tsup/driver-test-suite/mod.js"
},
"require": {
"types": "./dist/driver-test-suite/mod.d.cts",
"default": "./dist/driver-test-suite/mod.cjs"
"types": "./dist/tsup/driver-test-suite/mod.d.cts",
"default": "./dist/tsup/driver-test-suite/mod.cjs"
}
},
"./topologies/coordinate": {
"import": {
"types": "./dist/topologies/coordinate/mod.d.ts",
"default": "./dist/topologies/coordinate/mod.js"
"types": "./dist/tsup/topologies/coordinate/mod.d.ts",
"default": "./dist/tsup/topologies/coordinate/mod.js"
},
"require": {
"types": "./dist/topologies/coordinate/mod.d.cts",
"default": "./dist/topologies/coordinate/mod.cjs"
"types": "./dist/tsup/topologies/coordinate/mod.d.cts",
"default": "./dist/tsup/topologies/coordinate/mod.cjs"
}
},
"./topologies/partition": {
"import": {
"types": "./dist/topologies/partition/mod.d.ts",
"default": "./dist/topologies/partition/mod.js"
"types": "./dist/tsup/topologies/partition/mod.d.ts",
"default": "./dist/tsup/topologies/partition/mod.js"
},
"require": {
"types": "./dist/topologies/partition/mod.d.cts",
"default": "./dist/topologies/partition/mod.cjs"
"types": "./dist/tsup/topologies/partition/mod.d.cts",
"default": "./dist/tsup/topologies/partition/mod.cjs"
}
},
"./test": {
"import": {
"types": "./dist/test/mod.d.ts",
"default": "./dist/test/mod.js"
"types": "./dist/tsup/test/mod.d.ts",
"default": "./dist/tsup/test/mod.js"
},
"require": {
"types": "./dist/test/mod.d.cts",
"default": "./dist/test/mod.cjs"
"types": "./dist/tsup/test/mod.d.cts",
"default": "./dist/tsup/test/mod.cjs"
}
},
"./inspector": {
"import": {
"types": "./dist/inspector/mod.d.ts",
"default": "./dist/inspector/mod.js"
"types": "./dist/tsup/inspector/mod.d.ts",
"default": "./dist/tsup/inspector/mod.js"
},
"require": {
"types": "./dist/inspector/mod.d.cts",
"default": "./dist/inspector/mod.cjs"
"types": "./dist/tsup/inspector/mod.d.cts",
"default": "./dist/tsup/inspector/mod.cjs"
}
}
},
Expand All @@ -150,16 +150,18 @@
"scripts": {
"dev": "pnpm build --watch",
"build": "tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/topologies/coordinate/mod.ts src/topologies/partition/mod.ts src/utils.ts src/driver-helpers/mod.ts src/driver-test-suite/mod.ts src/test/mod.ts src/inspector/mod.ts",
"build:schema": "node ../../packages/misc/bare-compiler/dist/cli.js compile schemas/client-protocol/v1.bare -o dist/schemas/client-protocol/v1.ts && node ../../packages/misc/bare-compiler/dist/cli.js compile schemas/file-system-driver/v1.bare -o dist/schemas/file-system-driver/v1.ts ",
"check-types": "tsc --noEmit",
"boop": "tsc --outDir dist/test -d",
"test": "vitest run",
"test:watch": "vitest",
"dump-openapi": "tsx scripts/dump-openapi.ts"
},
"dependencies": {
"@bare-ts/lib": "~0.3.0",
"@hono/standard-validator": "^0.1.3",
"@hono/zod-openapi": "^0.19.10",
"@rivetkit/fast-json-patch": "^3.1.2",
"@rivetkit/versioned-data-util": "workspace:*",
"cbor-x": "^1.6.0",
"hono": "^4.7.0",
"invariant": "^2.2.4",
Expand All @@ -173,6 +175,7 @@
"@hono/node-server": "^1.18.2",
"@hono/node-ws": "^1.1.1",
"@rivet-gg/actor-core": "^25.1.0",
"@rivetkit/bare-compiler": "workspace:*",
"@types/invariant": "^2",
"@types/node": "^22.13.1",
"@types/ws": "^8",
Expand Down
82 changes: 82 additions & 0 deletions packages/core/schemas/client-protocol/v1.bare
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# MARK: Message To Client
type Init struct {
actorId: str
connectionId: str
connectionToken: str
}

type Error struct {
code: str
message: str
metadata: optional<data>
actionId: optional<uint>
}

type ActionResponse struct {
id: uint
output: data
}

type Event struct {
name: str
# CBOR array
args: data
}

type ToClientBody union {
Init |
Error |
ActionResponse |
Event
}

type ToClient struct {
body: ToClientBody
}

# MARK: Message To Server
type ActionRequest struct {
id: uint
name: str
# CBOR array
args: data
}

type SubscriptionRequest struct {
eventName: str
subscribe: bool
}

type ToServerBody union {
ActionRequest |
SubscriptionRequest
}

type ToServer struct {
body: ToServerBody
}

# MARK: HTTP Action
type HttpActionRequest struct {
# CBOR array
args: data
}

type HttpActionResponse struct {
output: data
}

# MARK: HTTP Error
type HttpResponseError struct {
code: str
message: str
metadata: optional<data>
}

# MARK: HTTP Resolve
type HttpResolveRequest void

type HttpResolveResponse struct {
actorId: str
}

20 changes: 20 additions & 0 deletions packages/core/schemas/file-system-driver/v1.bare
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# File System Driver Schema (v1)

# MARK: Actor State
# Represents the persisted state for an actor on disk.
# Note: createdAt is not persisted; it is derived from the file's birthtime.
type ActorState struct {
id: str
name: str
key: list<str>
persistedData: data
}

# MARK: Actor Alarm
# Represents a scheduled alarm for an actor.
# Stored per-actor; the actor id is implied by the filename.
# The timestamp is milliseconds since epoch.
type ActorAlarm struct {
timestamp: uint
}

24 changes: 15 additions & 9 deletions packages/core/src/actor/connection.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type * as messageToClient from "@/actor/protocol/message/to-client";
import type * as wsToClient from "@/actor/protocol/message/to-client";
import * as cbor from "cbor-x";
import type * as protocol from "@/schemas/client-protocol/mod";
import { TO_CLIENT_VERSIONED } from "@/schemas/client-protocol/versioned";
import { bufferToArrayBuffer } from "@/utils";
import type { AnyDatabaseProvider } from "./database";
import { type ConnDriver, ConnectionReadyState } from "./driver";
import * as errors from "./errors";
Expand Down Expand Up @@ -162,7 +164,7 @@ export class Conn<S, CP, CS, V, I, AD, DB extends AnyDatabaseProvider> {
*
* @protected
*/
public _sendMessage(message: CachedSerializer<messageToClient.ToClient>) {
public _sendMessage(message: CachedSerializer<protocol.ToClient>) {
this.#driver.sendMessage?.(this.#actor, this, this.__persist.ds, message);
}

Expand All @@ -181,14 +183,18 @@ export class Conn<S, CP, CS, V, I, AD, DB extends AnyDatabaseProvider> {
connId: this.id,
});
this._sendMessage(
new CachedSerializer<wsToClient.ToClient>({
b: {
ev: {
n: eventName,
a: args,
new CachedSerializer<protocol.ToClient>(
{
body: {
tag: "Event",
val: {
name: eventName,
args: bufferToArrayBuffer(cbor.encode(args)),
},
},
},
}),
TO_CLIENT_VERSIONED,
),
);
}

Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/actor/driver.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type * as messageToClient from "@/actor/protocol/message/to-client";
import type { CachedSerializer } from "@/actor/protocol/serde";
import type { AnyClient } from "@/client/client";
import type { ManagerDriver } from "@/manager/driver";
import type { RegistryConfig } from "@/registry/config";
import type { RunConfig } from "@/registry/run-config";
import type * as protocol from "@/schemas/client-protocol/mod";
import type { AnyConn, ConnectionDriver } from "./connection";
import type { GenericConnGlobalState } from "./generic-conn-driver";
import type { AnyActorInstance } from "./instance";
Expand Down Expand Up @@ -42,7 +42,7 @@ export interface ActorDriver {
*/
getDatabase(actorId: string): Promise<unknown | undefined>;

sleep?(actorId: string): void;
sleep?(actorId: string): Promise<void>;

shutdown?(immediate: boolean): Promise<void>;
}
Expand All @@ -60,7 +60,7 @@ export interface ConnDriver<ConnDriverState = unknown> {
actor: AnyActorInstance,
conn: AnyConn,
state: ConnDriverState,
message: CachedSerializer<messageToClient.ToClient>,
message: CachedSerializer<protocol.ToClient>,
): void;

/**
Expand Down
Loading
Loading