solid-objects 0.13.0 → 0.13.2
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/CHANGELOG.md +33 -1
- package/README.md +71 -9
- package/dist/actor.d.ts +5 -0
- package/dist/actor.d.ts.map +1 -1
- package/dist/actor.js +32 -0
- package/dist/actor.js.map +1 -1
- package/dist/broadcast-worker.d.ts +2 -0
- package/dist/broadcast-worker.d.ts.map +1 -1
- package/dist/broadcast-worker.js +25 -5
- package/dist/broadcast-worker.js.map +1 -1
- package/dist/configuration.d.ts +2 -0
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js +3 -0
- package/dist/configuration.js.map +1 -1
- package/dist/doctor.js +2 -2
- package/dist/doctor.js.map +1 -1
- package/dist/effect-worker.d.ts +2 -0
- package/dist/effect-worker.d.ts.map +1 -1
- package/dist/effect-worker.js +25 -5
- package/dist/effect-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/polling-backoff.d.ts +23 -0
- package/dist/polling-backoff.d.ts.map +1 -0
- package/dist/polling-backoff.js +33 -0
- package/dist/polling-backoff.js.map +1 -0
- package/dist/process-administration.d.ts +5 -0
- package/dist/process-administration.d.ts.map +1 -1
- package/dist/process-administration.js +9 -0
- package/dist/process-administration.js.map +1 -1
- package/dist/records.d.ts +1 -0
- package/dist/records.d.ts.map +1 -1
- package/dist/reminder-administration.d.ts +2 -0
- package/dist/reminder-administration.d.ts.map +1 -1
- package/dist/reminder-administration.js.map +1 -1
- package/dist/reminder-scheduler.d.ts +2 -0
- package/dist/reminder-scheduler.d.ts.map +1 -1
- package/dist/reminder-scheduler.js +26 -6
- package/dist/reminder-scheduler.js.map +1 -1
- package/dist/repository.d.ts +1 -0
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +17 -4
- package/dist/repository.js.map +1 -1
- package/dist/runtime.d.ts +6 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +43 -5
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +14 -1
- package/dist/schema.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wake-up/postgresql.d.ts.map +1 -1
- package/dist/wake-up/postgresql.js +12 -11
- package/dist/wake-up/postgresql.js.map +1 -1
- package/dist/wake-up.d.ts +1 -1
- package/dist/wake-up.d.ts.map +1 -1
- package/dist/wake-up.js +11 -10
- package/dist/wake-up.js.map +1 -1
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +25 -5
- package/dist/worker.js.map +1 -1
- package/docs/api.md +52 -4
- package/docs/architecture.md +5 -2
- package/docs/benchmarks.md +40 -0
- package/docs/configuration.md +11 -2
- package/docs/operations.md +39 -10
- package/docs/parity.md +2 -2
- package/docs/releasing.md +2 -2
- package/package.json +2 -1
package/dist/worker.d.ts
CHANGED
|
@@ -6,9 +6,11 @@ export declare class Worker {
|
|
|
6
6
|
private registered;
|
|
7
7
|
private stopping;
|
|
8
8
|
private readonly activations;
|
|
9
|
+
private readonly pollingBackoff;
|
|
9
10
|
constructor(runtime: SolidObjectsRuntime, options?: {
|
|
10
11
|
setupFailure?: "report" | "throw";
|
|
11
12
|
});
|
|
13
|
+
get currentPollingIntervalMilliseconds(): number;
|
|
12
14
|
runOnce(options?: {
|
|
13
15
|
activationRetention?: "retain" | "release";
|
|
14
16
|
}): Promise<number>;
|
package/dist/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAUvD,qBAAa,MAAM;IAQf,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,QAAQ,CAAC,SAAS,sDAAe;IACjC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAG5B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;KAAO;IAmBtE,IAAI,kCAAkC,IAAI,MAAM,CAE/C;IAEK,OAAO,CAAC,OAAO,GAAE;QAAE,mBAAmB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAyEtF,YAAY,CAAC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAelE,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7C,eAAe,IAAI,IAAI;IAIvB,OAAO,IAAI,OAAO;IAIZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,wBAAwB;YAUxB,gBAAgB;YAMhB,qBAAqB;YAUrB,yBAAyB;YA6BzB,iBAAiB;YASjB,kBAAkB;IAQhC,OAAO,CAAC,kBAAkB;CAgB3B;AAmBD,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE;IAC1D,OAAO,EAAE,mBAAmB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB"}
|
package/dist/worker.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { ActorSetupFailed, ApplicationWriteForbidden, LostActivation, StateMigrationError, } from "./errors.js";
|
|
3
|
+
import { PollingBackoff } from "./polling-backoff.js";
|
|
3
4
|
export class Worker {
|
|
4
5
|
runtime;
|
|
5
6
|
options;
|
|
@@ -7,9 +8,21 @@ export class Worker {
|
|
|
7
8
|
registered = false;
|
|
8
9
|
stopping = false;
|
|
9
10
|
activations = new Map();
|
|
11
|
+
pollingBackoff;
|
|
10
12
|
constructor(runtime, options = {}) {
|
|
11
13
|
this.runtime = runtime;
|
|
12
14
|
this.options = options;
|
|
15
|
+
this.pollingBackoff = new PollingBackoff({
|
|
16
|
+
minimumIntervalMilliseconds: Math.min(runtime.settings.pollingIntervalMilliseconds, runtime.settings.leaseRenewalIntervalMilliseconds),
|
|
17
|
+
maximumIntervalMilliseconds: Math.min(runtime.settings.idlePollingIntervalMilliseconds, runtime.settings.leaseRenewalIntervalMilliseconds),
|
|
18
|
+
onChange: (transition) => runtime.emitInstrumentation("polling.interval_changed", {
|
|
19
|
+
role: "actors",
|
|
20
|
+
...transition,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
get currentPollingIntervalMilliseconds() {
|
|
25
|
+
return this.pollingBackoff.currentIntervalMilliseconds;
|
|
13
26
|
}
|
|
14
27
|
async runOnce(options = {}) {
|
|
15
28
|
try {
|
|
@@ -111,15 +124,22 @@ export class Worker {
|
|
|
111
124
|
}
|
|
112
125
|
async run(signal) {
|
|
113
126
|
await this.ensureRegistered();
|
|
127
|
+
await this.runtime.warnIfPollingIsOnlyCrossProcessWakeUp();
|
|
114
128
|
while (!signal.aborted && !this.stopping) {
|
|
115
129
|
const wakeUp = await this.runtime.settings.wakeUp.watch("actors");
|
|
116
130
|
const processed = await this.runOnce();
|
|
117
|
-
if (processed
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
signal,
|
|
121
|
-
});
|
|
131
|
+
if (processed > 0) {
|
|
132
|
+
this.pollingBackoff.reset("work");
|
|
133
|
+
continue;
|
|
122
134
|
}
|
|
135
|
+
const notified = await wakeUp.wait({
|
|
136
|
+
timeoutMilliseconds: this.pollingBackoff.currentIntervalMilliseconds,
|
|
137
|
+
signal,
|
|
138
|
+
});
|
|
139
|
+
if (notified === false)
|
|
140
|
+
this.pollingBackoff.recordIdle();
|
|
141
|
+
else
|
|
142
|
+
this.pollingBackoff.reset("wake_up");
|
|
123
143
|
}
|
|
124
144
|
await this.stop();
|
|
125
145
|
}
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
package/docs/api.md
CHANGED
|
@@ -79,6 +79,48 @@ function playerForSession<PlayerType extends { sessionId: string }>(options: {
|
|
|
79
79
|
}
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
### Reminders
|
|
83
|
+
|
|
84
|
+
A reminder is one alarm per actor and name. Scheduling a name that is already
|
|
85
|
+
armed **moves the existing alarm** rather than adding a second one, which is
|
|
86
|
+
what makes a reminder safe to re-arm from a handler that may run more than once.
|
|
87
|
+
|
|
88
|
+
Without a key that name is the operation, so one actor holds one alarm per
|
|
89
|
+
operation, and arming one per queued item keeps only the last:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Wrong. Every entry overwrites the previous entry's alarm.
|
|
93
|
+
add({ entry }: { entry: Entry }): void {
|
|
94
|
+
this.entries = [...this.entries, entry]
|
|
95
|
+
this.schedule({ at: new Date(entry.waitUntil) }).deliver!()
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Pass `key` when an actor is waiting on several things at once. The key is your
|
|
100
|
+
own identifier for the item and names that item's alarm, so each item gets one:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
add({ entry }: { entry: Entry }): void {
|
|
104
|
+
this.entries = [...this.entries, entry]
|
|
105
|
+
this.schedule({ at: new Date(entry.waitUntil), key: entry.id }).deliver!()
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Scheduling the same key again moves that item's alarm and leaves the others
|
|
110
|
+
alone. The operation still decides which handler runs; the key only decides
|
|
111
|
+
which alarm is which.
|
|
112
|
+
|
|
113
|
+
A key must be non-empty, and the name it composes must fit the 255 characters
|
|
114
|
+
MySQL holds it in. That is checked on the composed name rather than the key
|
|
115
|
+
alone, so a long operation with a short key is caught too. A key may hold colons
|
|
116
|
+
of its own, because an actor member name cannot.
|
|
117
|
+
|
|
118
|
+
An actor that only needs to know "what is next" can still keep one alarm and
|
|
119
|
+
drain everything due when it fires. That costs one row instead of one per item
|
|
120
|
+
and cannot strand an entry when an occurrence is coalesced, so prefer it for a
|
|
121
|
+
large queue of interchangeable items and prefer `key` when an item needs an
|
|
122
|
+
alarm that can be moved on its own.
|
|
123
|
+
|
|
82
124
|
### Runtime managers
|
|
83
125
|
|
|
84
126
|
Every manager below is available as a property on `SolidObjectsRuntime`; the
|
|
@@ -89,6 +131,9 @@ class and result types are also exported for integration typing.
|
|
|
89
131
|
idempotent paused-alarm `resume()`.
|
|
90
132
|
- `runtime.processes` / `ProcessManager`: immutable role `all()` and stale-owner
|
|
91
133
|
`cleanup()`.
|
|
134
|
+
- `runtime.administration` / `AdministrationManager`: an authorized
|
|
135
|
+
`processes()` query for inspecting live and stale process rows through the
|
|
136
|
+
runtime's own database adapter.
|
|
92
137
|
- `runtime.reconciliation` / `ReconciliationManager`: `active()`,
|
|
93
138
|
`withoutPendingWork()`, `statesFor()`, and `orphaned()` bounded reads.
|
|
94
139
|
- `runtime.retention` / `RetentionManager`: `preview()` and authorized `prune()`
|
|
@@ -179,14 +224,17 @@ Factories should create fresh mutable state and `stop()` should be idempotent.
|
|
|
179
224
|
exported for test runners and hosts that intentionally operate roles outside
|
|
180
225
|
`runtime.run()`. Runtime factory methods create the same classes. Each provides
|
|
181
226
|
`runOnce()`, bounded `runUntilIdle()`, `run(signal)`, `requestShutdown()`,
|
|
182
|
-
`stopped()`,
|
|
183
|
-
|
|
184
|
-
|
|
227
|
+
`stopped()`, `stop()`, and the inspectable
|
|
228
|
+
`currentPollingIntervalMilliseconds`. Manual roles still register process
|
|
229
|
+
ownership and must be stopped. Prefer `runtime.run()` in production and
|
|
230
|
+
`runtime.testing` in tests.
|
|
185
231
|
|
|
186
232
|
`InProcessWakeUpAdapter`, `WakeUpAdapter`, `WakeUpRole`, `WakeUpWatch`, and
|
|
187
233
|
`WakeUpWaitOptions` define the notification extension. A watch must be obtained
|
|
188
234
|
before checking durable state so a notification cannot fall between claim and
|
|
189
|
-
wait.
|
|
235
|
+
wait. `WakeUpWatch.wait()` returns `true` for a notification and `false` for a
|
|
236
|
+
timeout or cancellation. A legacy `void` result remains accepted and preserves
|
|
237
|
+
the fast polling cadence.
|
|
190
238
|
|
|
191
239
|
### Errors
|
|
192
240
|
|
package/docs/architecture.md
CHANGED
|
@@ -25,7 +25,9 @@ Each role takes a generation watch before checking for work. A post-commit
|
|
|
25
25
|
wake-up therefore cannot fall into the gap between an empty claim and the
|
|
26
26
|
worker's wait. The default adapter broadcasts within one process; polling
|
|
27
27
|
remains active as the durable fallback and custom adapters can bridge process
|
|
28
|
-
boundaries.
|
|
28
|
+
boundaries. Empty passes double the role's wait up to the configured idle
|
|
29
|
+
ceiling. Work or a notification resets it to the fast interval, and an actor
|
|
30
|
+
worker's ceiling never exceeds its lease-renewal interval.
|
|
29
31
|
|
|
30
32
|
Each runtime role occupies a supervised factory slot. An unexpected promise
|
|
31
33
|
resolution or rejection cleans up that instance, waits with capped exponential
|
|
@@ -63,7 +65,8 @@ per runtime listens on role-specific channels before the worker checks durable
|
|
|
63
65
|
state, which closes the listener-startup race without holding a polling
|
|
64
66
|
connection per worker. A notification advances a process-local role generation
|
|
65
67
|
and wakes every matching waiter. Reconnection and notification loss fall back
|
|
66
|
-
to the
|
|
68
|
+
to adaptive polling, whose current wait can be as long as the configured idle
|
|
69
|
+
ceiling.
|
|
67
70
|
|
|
68
71
|
The optional Redis adapter provides the same role generations through Pub/Sub
|
|
69
72
|
for deployments that already operate Redis. It keeps commands and subscriptions
|
package/docs/benchmarks.md
CHANGED
|
@@ -3,6 +3,46 @@
|
|
|
3
3
|
The benchmark harness measures committed actor operations. It is intended to
|
|
4
4
|
show tradeoffs and catch large regressions, not to predict application capacity.
|
|
5
5
|
|
|
6
|
+
## Idle polling
|
|
7
|
+
|
|
8
|
+
The idle harness measures process CPU and empty database passes for the four
|
|
9
|
+
runtime roles:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm run benchmark:idle
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
It warms each interval for three seconds, measures for ten seconds, and reports
|
|
16
|
+
process user plus system CPU time divided by wall time.
|
|
17
|
+
|
|
18
|
+
Measured on August 16, 2026 on an Apple M5 with Node.js 26.7.0 and in-memory
|
|
19
|
+
SQLite. The before run used 0.13.0; the after run used the prepared 0.13.1 tree.
|
|
20
|
+
Each run started one actor, effect, reminder, and broadcast role.
|
|
21
|
+
|
|
22
|
+
| Fast interval | Before polls/s | Before CPU | After polls/s | After CPU |
|
|
23
|
+
| ------------: | -------------: | ---------: | ------------: | --------: |
|
|
24
|
+
| 20 ms | 188.78 | 3.254% | 4.000 | 0.129% |
|
|
25
|
+
| 100 ms | 39.596 | 0.906% | 3.999 | 0.121% |
|
|
26
|
+
| 500 ms | 7.999 | 0.251% | 3.999 | 0.104% |
|
|
27
|
+
|
|
28
|
+
The after run reached the one-second ceiling for all four roles. These are
|
|
29
|
+
developer-laptop measurements, not a CPU guarantee; timer scheduling, JIT,
|
|
30
|
+
database path, and unrelated host activity affect short samples.
|
|
31
|
+
|
|
32
|
+
Five SQLite samples measured durable enqueue through committed completion after
|
|
33
|
+
2.5 seconds of idleness. The polling-only multi-process harness submits just
|
|
34
|
+
after an empty pass, so it measures approximately the full polling wait rather
|
|
35
|
+
than average arrival latency.
|
|
36
|
+
|
|
37
|
+
| Topology | 0.13.0 p50 | Prepared 0.13.1 p50 |
|
|
38
|
+
| ------------------------------- | ---------: | ------------------: |
|
|
39
|
+
| One process, in-process wake-up | 2.589 ms | 2.662 ms |
|
|
40
|
+
| Two processes, polling only | 107.945 ms | 1,006.232 ms |
|
|
41
|
+
|
|
42
|
+
The local wake-up keeps the one-process path prompt after backoff. The
|
|
43
|
+
polling-only row is the explicit tradeoff: use PostgreSQL notifications or
|
|
44
|
+
optional Redis Pub/Sub when separate processes need low-latency delivery.
|
|
45
|
+
|
|
6
46
|
## Scenarios
|
|
7
47
|
|
|
8
48
|
- `warm-hot`: all operations target one previously created identity.
|
package/docs/configuration.md
CHANGED
|
@@ -11,6 +11,7 @@ through `runtime.ref(ActorClass, actorId)`. Both validate options immediately.
|
|
|
11
11
|
| `database` | required | A `Database` adapter. |
|
|
12
12
|
| `tableNamePrefix` | `"solid_objects_"` | Lowercase letters, digits, and underscores; must start with a letter. |
|
|
13
13
|
| `pollingIntervalMilliseconds` | `100` | Positive durable-work polling interval. |
|
|
14
|
+
| `idlePollingIntervalMilliseconds` | `1_000` | Positive ceiling after consecutive empty polling passes. |
|
|
14
15
|
| `syncPollingIntervalMilliseconds` | `50` | Positive result-wait polling interval. |
|
|
15
16
|
| `leaseDurationMilliseconds` | `30_000` | Positive activation lease; must exceed renewal interval. |
|
|
16
17
|
| `leaseRenewalIntervalMilliseconds` | `10_000` | Positive activation renewal cadence. |
|
|
@@ -52,8 +53,16 @@ affected failure path rather than schedule an invalid timestamp.
|
|
|
52
53
|
|
|
53
54
|
Counts may be zero, but the complete configuration must leave at least one
|
|
54
55
|
runtime role enabled. Broadcast workers are started only when `broadcast` or
|
|
55
|
-
`authorizeSubscription` is configured.
|
|
56
|
-
|
|
56
|
+
`authorizeSubscription` is configured.
|
|
57
|
+
|
|
58
|
+
`pollingIntervalMilliseconds` is the fast interval after work or a wake-up.
|
|
59
|
+
Consecutive empty passes double it up to
|
|
60
|
+
`idlePollingIntervalMilliseconds`. Actor workers never wait longer than
|
|
61
|
+
`leaseRenewalIntervalMilliseconds`. Set the fast and idle values equal for a
|
|
62
|
+
fixed cadence. A custom wake-up adapter should return `true` for a notification
|
|
63
|
+
and `false` for a timeout; an older adapter that returns `void` remains
|
|
64
|
+
compatible and keeps the fast cadence. Wake-ups reduce latency, while database
|
|
65
|
+
polling remains the correctness path.
|
|
57
66
|
|
|
58
67
|
## Retention and cleanup
|
|
59
68
|
|
package/docs/operations.md
CHANGED
|
@@ -1,12 +1,38 @@
|
|
|
1
1
|
# Operations
|
|
2
2
|
|
|
3
|
-
Runtime roles use durable polling as the correctness fallback.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
Runtime roles use durable polling as the correctness fallback. Consecutive
|
|
4
|
+
empty passes double each role's wait from `pollingIntervalMilliseconds` to
|
|
5
|
+
`idlePollingIntervalMilliseconds`, which defaults to one second. Processed
|
|
6
|
+
work and wake-up notifications reset the role to the fast interval. Actor
|
|
7
|
+
workers clamp the ceiling to `leaseRenewalIntervalMilliseconds` while they may
|
|
8
|
+
hold cached activations.
|
|
9
|
+
|
|
10
|
+
The default generation-based wake-up adapter interrupts waits for new actor
|
|
11
|
+
messages, effects, reminders, and broadcasts in the same Node process. It does
|
|
12
|
+
not cross a process boundary. When live processes share the database without a
|
|
13
|
+
configured adapter, the runtime logs
|
|
14
|
+
`solid_objects.polling_only_cross_process_wake_up` once. Use PostgreSQL
|
|
15
|
+
notifications or optional Redis Pub/Sub when separate processes need prompt
|
|
16
|
+
delivery; without one, newly committed work can wait up to the current idle
|
|
17
|
+
polling interval. Notification errors are isolated and logged by role and error
|
|
18
|
+
class without failing the committed work.
|
|
19
|
+
|
|
20
|
+
The warning excludes process rows with the current hostname and host process ID.
|
|
21
|
+
It can therefore appear during a rolling deployment or restart overlap when an
|
|
22
|
+
older and newer process briefly share the same database. A process that stopped
|
|
23
|
+
without graceful cleanup remains live until its heartbeat exceeds
|
|
24
|
+
`processAliveThresholdMilliseconds`; inspect
|
|
25
|
+
`runtime.administration.processes()` to distinguish a live overlap from a stale
|
|
26
|
+
row.
|
|
27
|
+
|
|
28
|
+
Each role exposes `currentPollingIntervalMilliseconds`.
|
|
29
|
+
`solid_objects.polling.interval_changed` reports the role, reason, previous
|
|
30
|
+
interval, and current interval. The polling-only warning is also emitted as
|
|
31
|
+
`solid_objects.polling.only_cross_process_wake_up` instrumentation.
|
|
32
|
+
|
|
33
|
+
Graceful shutdown stops new claims and allows active turns to finish within
|
|
34
|
+
`shutdownTimeoutMilliseconds`, which defaults to 15 seconds. A component still
|
|
35
|
+
running or stopping at the deadline emits
|
|
10
36
|
`solid_objects.supervisor.component_shutdown_timeout`; the runtime then returns
|
|
11
37
|
without pretending JavaScript code was forcibly terminated. Operators should
|
|
12
38
|
monitor oldest ready work, claimed work, dead letters, effect failures,
|
|
@@ -44,9 +70,12 @@ runs under the application-write guard, and `onDeactivate()` is best effort:
|
|
|
44
70
|
it may not run after a crash, cannot establish a correctness guarantee, and a
|
|
45
71
|
failure is logged without preventing lease release.
|
|
46
72
|
|
|
47
|
-
`runtime.processes
|
|
48
|
-
|
|
49
|
-
|
|
73
|
+
`runtime.administration.processes()` returns the same administration-authorized
|
|
74
|
+
immutable process metadata as `runtime.processes.all()`, with hostname, host
|
|
75
|
+
process ID, Node and Solid Objects versions, and a current `stale` flag. It is
|
|
76
|
+
safe to call through the runtime's database adapter while workers are running;
|
|
77
|
+
the query is serialized with other database access and does not require a
|
|
78
|
+
second SQLite connection. Graceful shutdown first persists `draining` with a
|
|
50
79
|
`shutdownRequestedAt` timestamp, then deactivates owned actors and atomically
|
|
51
80
|
releases every role claim before persisting `stopped`. `cleanup()` reauthorizes
|
|
52
81
|
separately and performs the same release for stale running or draining
|
package/docs/parity.md
CHANGED
|
@@ -4,11 +4,11 @@ This ledger tracks capability parity with the Ruby `solid_objects` gem.
|
|
|
4
4
|
Parity means preserving a capability and its correctness or security boundary,
|
|
5
5
|
not copying a Rails API into Node.
|
|
6
6
|
|
|
7
|
-
Reference: Ruby `solid_objects` 0.13.
|
|
7
|
+
Reference: Ruby `solid_objects` 0.13.2. The JavaScript package began at the
|
|
8
8
|
Ruby design's `0.12` capability generation; that version number did not imply
|
|
9
9
|
earlier JavaScript releases.
|
|
10
10
|
|
|
11
|
-
The Node `0.13.
|
|
11
|
+
The Node `0.13.2` implementation has capability parity with that reference. Its
|
|
12
12
|
relational runtime, correctness boundaries, administration, diagnostics,
|
|
13
13
|
operator dashboard, realtime projections, browser behavior, and supported
|
|
14
14
|
adapters have native equivalents. Rails-specific rendering surfaces are
|
package/docs/releasing.md
CHANGED
|
@@ -38,8 +38,8 @@ npm trust github solid-objects \
|
|
|
38
38
|
4. Create and push an annotated tag matching the package version:
|
|
39
39
|
|
|
40
40
|
```shell
|
|
41
|
-
git tag -a v0.13.
|
|
42
|
-
git push origin v0.13.
|
|
41
|
+
git tag -a v0.13.2 -m "Version 0.13.2"
|
|
42
|
+
git push origin v0.13.2
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
The tag runs the complete CI matrix. The publish job starts only after every
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "solid-objects",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.2",
|
|
4
4
|
"description": "Race-free realtime state per application identity, backed by your SQL database",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
"test:redis": "vitest run test/redis-wake-up.test.ts",
|
|
86
86
|
"test:watch": "vitest",
|
|
87
87
|
"benchmark": "pnpm run build && node benchmarks/run.ts",
|
|
88
|
+
"benchmark:idle": "pnpm run build && node benchmarks/idle.ts",
|
|
88
89
|
"pack:check": "pnpm pack --dry-run && node scripts/check-package.mjs",
|
|
89
90
|
"prepack": "pnpm run build"
|
|
90
91
|
},
|